tôi đã bắt đầu làm việc với một số mã NET 3.5 và thấy phương pháp mở rộng sau đây được sử dụng cho một bộ nhớ cache ::Đối với .NET 3.5, bạn sẽ tạo một bộ đệm an toàn hoặc thêm bộ nhớ cache như thế nào?
public static TValue GetOrAdd<TKey, TValue>(this Dictionary<TKey, TValue> @this, TKey key,Func<TKey,TValue> factory,bool useLocking)
{
TValue value;
if([email protected](key,out value))
{
if (useLocking)
{
lock ((@this as ICollection).SyncRoot)
{
if ([email protected](key, out value))
{
@this[key] = value = factory(key);
}
}
}
else
{
@this[key] = value = factory(key);
}
}
return value;
}
Bộ nhớ cache trong câu hỏi là keyed bởi phím chuỗi, và với useLocking = true. Nó luôn luôn được truy cập bằng phương pháp này (không có đi lạc TryGetValue
). Cũng không có vấn đề gì trong việc sử dụng thuộc tính SyncRoot
vì từ điển là riêng tư và không có nơi nào khác được sử dụng. Khóa kép nguy hiểm vì một từ điển không hỗ trợ đọc trong khi nó được ghi vào. Mặc dù về mặt kỹ thuật, chưa có vấn đề nào được báo cáo vì sản phẩm không được vận chuyển, tôi cảm thấy rằng cách tiếp cận này sẽ dẫn đến các điều kiện chủng tộc.
Chuyển
Dictionary<,>
thànhHashtable
. Chúng tôi sẽ mất an toàn loại nhưng chúng tôi sẽ có thể hỗ trợ mô hình đồng thời mà chúng tôi đang theo dõi, (1 nhà văn, nhiều người đọc).Xóa bên ngoài TryGetValue. Bằng cách đó mọi đọc, đòi hỏi phải có một khóa. Điều này có khả năng xấu cho hiệu suất, nhưng có được một khóa không được kiểm soát nên khá rẻ.
Cả hai đều khá crappy. Có ai có đề xuất tốt hơn không? Nếu đây là mã .NET 4, tôi chỉ chuyển nó thành ConcurrentDictionary
, nhưng tôi không có tùy chọn đó.
Yargh! Hoàn toàn không liên quan ... nhưng không viết mã bằng cách sử dụng @this. Bạn đang ở trong một phương pháp tĩnh; không cố gắng làm cho nó trông giống như một phương pháp thể hiện. –
đây không phải là mã của tôi! Nếu đó là mã của tôi, tôi sẽ thêm xác thực đối số. –