2016-06-23 16 views
5

Hãy xem xét các tình huống sauphương pháp NET Force hoãn thực hiện

private static ConcurrentDictionary<string, ConcurrentDictionary<string, string>> CachedData; 

nơi nhiều đề truy cập vào biến này thông qua một phương pháp gọi

ConcurrentDictionary<string, string> dic = CachedData.GetorAdd(key, HeavyDataLoadMethod()) 

mà phương pháp này thực hiện một số hoạt động trọng lượng nặng để lấy dữ liệu

private ConcurrentDictionary<string, string> HeavyDataLoadMethod() 
{ 
     var data = new ConcurrentDictionary<string,string>(SomeLoad()); 
     foreach (var item in OtherLoad()) 
      //Operations on data 
     return data; 
} 

Vấn đề của tôi ở đây là nếu tôi sử dụng GetorAddHeavyDataLoadMethod được thực thi ngay cả khi không cần thiết.

Tôi đã tự hỏi nếu có một số cách để tận dụng lợi thế của hoãn thực hiện trong trường hợp này và làm cho số HeavyDataLoadMethod bị trì hoãn để nó không được thực hiện cho đến khi nó thực sự cần thiết.

(Vâng, tôi biết điều này là đơn giản như kiểm tra với một containsKey và quên nó đi, nhưng tôi tò mò về cách tiếp cận này)

Trả lời

4

Bạn có thể vượt qua một đại biểu, thay vì gọi hàm trực tiếp:

hoặc vượt qua trong:

// notice removal of the `()` from the call to pass a delegate instead 
// of the result. 
ConcurrentDictionary<string, string> dic = CachedData.GetorAdd(key, HeavyDataLoadMethod) 

hoặc

ConcurrentDictionary<string, string> dic = CachedData.GetorAdd(key, 
    (key) => HeavyDataLoadMethod()) 

That way you pass in the pointer to the method, instead of the method results. Your heavy data load method must accept a parameter with the value of "key".

+0

Cảm ơn bạn đã chỉ ra quá tải của phương thức, chỉ cần những gì cần thiết –

Các vấn đề liên quan