2011-01-03 26 views
6

Tôi đang gặp khó khăn trong bộ sưu tập đồng thời và luồng, cụ thể bằng phương pháp AddOrUpdate trong ConcurrentDictionary về cơ bản ..... Tôi không thể đưa nó vào sử dụng .. Tôi không thể tìm thấy bất kỳ ví dụ tốt về nó ... và cũng không thể hiểu đầy đủ, ví dụ về ConcurrentQueue trong hướng dẫn lập trình MSDN .. phương phápSử dụng phương pháp AddOrUpdate trong ConcurrentDictionary trong .NET 4.0


AddOrUpdate trong ConcurrentDictionary cơ bản ..... tôi không thể đưa nó vào sử dụng .. Tôi không thể tìm thấy bất kỳ ví dụ tốt về nó ... và cũng không thể hiểu đầy đủ, ví dụ về ConcurrentQueue trong hướng dẫn lập trình MSDN ..

+0

Những khó khăn đang phải đối mặt với bạn? Bất kỳ thông báo lỗi nào? –

+0

AddOrUpdate phương pháp trong ConcurrentDictionary về cơ bản ..... Tôi không thể đưa nó vào sử dụng .. Tôi không thể tìm thấy bất kỳ ví dụ tốt về nó ... và cũng không thể hiểu đầy đủ, ví dụ về ConcurrentQueue trong lập trình MSDN hướng dẫn .. – Cheshta

+1

Bạn có "vấn đề khi sử dụng một công cụ cụ thể". Nhưng không có bất kỳ thông tin về những gì bạn muốn thực hiện (và tại sao) không thể có một câu trả lời tốt. Bỏ phiếu NARQ. –

Trả lời

28

Trong một từ điển thông thường, bạn có thể xem mã như thế này:

Dictionary<string, int> dictionary = GetDictionary(); 

if (dictionary.ContainsKey("MyKey")) 
{ 
    dictionary["MyKey"] += 5; 
} 
else 
{ 
    dictionary.Add("MyKey", 5); 
} 

này mã không thread-safe. Có nhiều điều kiện chủng tộc: "MyKey" có thể được thêm/xóa sau khi gọi tới ContainsKey và giá trị (nếu có) được liên kết với "MyKey" có thể được thay đổi giữa đọc và gán trong dòng sử dụng toán tử +=.

Phương pháp AddOrUpdate nhằm giải quyết các vấn đề luồng này bằng cách cung cấp cơ chế thêm hoặc cập nhật giá trị được liên kết với một khóa nhất định, tùy thuộc vào khóa có mặt hay không. Nó tương tự như TryGetValue ở chỗ nó kết hợp nhiều thao tác (trong trường hợp này, kiểm tra khóa và chèn hoặc sửa đổi một giá trị tùy thuộc vào sự hiện diện của khóa đã nói) vào một hành động nguyên tử hiệu quả không dễ bị điều kiện chủng tộc .

Chỉ cần để làm cho bê tông này, đây là cách bạn có thể sửa chữa các mã trên sử dụng AddOrUpdate:

ConcurrentDictionary<string, int> dictionary = GetDictionary(); 

// Either insert the key "MyKey" with the value 5 or, 
// if "MyKey" is already present, increase its value by 5. 
dictionary.AddOrUpdate("MyKey", 5, (s, i) => i + 5); 
Các vấn đề liên quan