Tôi có một số trường hợp tôi sử dụng ConcurrentDictionary<TKey, TValue>
để lưu vào bộ nhớ đệm các giá trị, nhưng thường tôi cần thực hiện xác thực giá trị để quyết định có thêm nó vào bộ nhớ cache bằng cách sử dụng ConcurrentDictionary<TKey, TValue>.GetOrAdd(TKey, Func<TKey, TValue>)
hay không.Làm cách nào để tôi có thể nói 'ConcurrentDictionary.GetOrAdd` để không thêm giá trị?
thường dọc theo dòng:
private readonly ConcurrentDictionary<Type, ISomeObject> someObjectCache =
new ConcurrentDictionary<Type, ISomeObject>();
public ISomeObject CreateSomeObject(Type someType)
{
return someObjectCache.GetOrAdd(someType, type =>
{
if(!Attribute.IsDefined(someType, typeof(SomeAttribute))
// Do something here to avoid the instance from being added to
// `someObjectCache`
ISomeObject someObject;
// Typical factory functionality goes here
return someObject;
});
}
Con đường tôi xử lý ngày hôm nay là để ném một ngoại lệ mà dường như làm việc tốt, nhưng tôi muốn một cách tiếp cận sạch (có thể là một lá cờ tôi có thể thiết lập hoặc một giá trị cụ thể tôi có thể thiết lập giá trị trả về) để hủy bỏ GetOrAdd
từ bên trong lambda (mặc dù nó có thể được thay thế bằng phương pháp thổi hoàn toàn).
Dựa trên kinh nghiệm của tôi với các phương pháp LINQ khác, trả lại null
sẽ dẫn đến giá trị được thêm mà không được kiểm tra như vậy (và đọc IL cho GetOrAdd
có vẻ như nó sẽ dẫn đến cùng một vấn đề), vì vậy tôi đừng nghĩ rằng nó sẽ hoạt động.
Có cách nào tôi có thể tránh sử dụng ngoại lệ để hủy thêm bằng GetOrAdd
không?
Nó sẽ (và _I have_) nhưng một khi bạn lộn xộn với tất cả các cơ chế khóa chủ đề cần thiết, nó trở nên khá lộn xộn (không phải của tôi không yêu cầu khóa ... chỉ không đến mức tương tự). Tôi đang tìm kiếm một giải pháp sạch hơn, không phải là một giải pháp đòi hỏi phải có phiên bản 'ConcurrentDictionary' của riêng tôi một cách hiệu quả. –
Cập nhật câu trả lời của tôi - GetOrAdd không khóa trên phần Thêm, chỉ xử lý các bit mảng nội bộ. Vì vậy, như tôi thấy nó, bạn không nên cần bất kỳ khóa ở đây nếu ý định của bạn là chỉ thêm xác nhận. –
Có, tôi đã đọc phần tài liệu đó, nhưng đây vẫn không phải là những gì tôi đang tìm kiếm. Nếu tôi muốn viết rất nhiều mã thì tôi sẽ tự xử lý khóa. –