2011-01-14 46 views
10

Tôi có một phương thức trả về một Tác vụ trong đó việc thực hiện có thể hoặc không cần thực hiện thao tác chậm để truy xuất kết quả. Tôi muốn có thể chỉ cần bọc giá trị kết quả vào một Tác vụ được đánh dấu là đã hoàn thành đồng bộ trong trường hợp giá trị đã có sẵn. Hôm nay tôi có một cái gì đó như thế này:Tạo một trình bao bọc nhiệm vụ xung quanh một đối tượng hiện có

public Task<Foo> GetFooAsync(int key) { 
    lock(this) { 
    if(_Cache.ContainsKey(key)) { 
     Task<Foo> ret = new Task<Foo>(()=>_Cache[key]); 
     ret.RunSynchronously(); 
     return ret; 
    } 
    else { 
     return Task.Factory.StartNew<Foo>(SomethingSlow()); 
    } 
    } 
} 

Có cách nào đơn giản hơn để làm điều này mà không yêu cầu tôi phải xây dựng nhiệm vụ với đại biểu khi tôi đã biết kết quả?

Trả lời

14

Bạn có thể sử dụng một TaskCompletionSource<TResult>:

var tcs = new TaskCompletionSource<Foo>(); 
tcs.SetResult(_Cache[key]); 
return tcs.Task; 

(Lưu ý rằng nếu _Cache là một Dictionary<TKey, TValue> bạn có thể sử dụng TryGetValue để làm cho nó một tra cứu duy nhất.)

1

Nếu bạn có một phiên bản đồng bộ của phương pháp này trả về kết quả bạn có thể làm như sau

Task<String>(()=> Hello(Name)); 

Phương thức hello sẽ như sau.

public String Hello(String Name) 
{ 
    return "Hello " + Name; 
} 
14

Bắt đầu với .NET 4.5, bạn có thể sử dụng phương pháp Task.FromResult<T>() tĩnh cho chính xác mục đích này:

return Task.FromResult(_Cache[key]); 
Các vấn đề liên quan