C# 围绕现有对象创建任务包装器

C# 围绕现有对象创建任务包装器,c#,task,task-parallel-library,C#,Task,Task Parallel Library,我有一个方法,它返回一个任务,在这个任务中,实现可能需要也可能不需要执行缓慢的操作来检索结果。我希望能够简单地将结果值包装到一个任务中,在该值已经可用的情况下,该任务被标记为已同步完成。今天我有这样的事情: public Task<Foo> GetFooAsync(int key) { lock(this) { if(_Cache.ContainsKey(key) ) { Task<Foo> ret = new Task<Foo>(()

我有一个方法,它返回一个任务,在这个任务中,实现可能需要也可能不需要执行缓慢的操作来检索结果。我希望能够简单地将结果值包装到一个任务中,在该值已经可用的情况下,该任务被标记为已同步完成。今天我有这样的事情:

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());
    }
  }
}
公共任务GetFooAsync(int键){ 锁(这个){ if(_Cache.ContainsKey(键)){ Task ret=新任务(()=>_Cache[key]); ret.RunSynchronously(); 返回ret; } 否则{ 返回Task.Factory.StartNew(SomethingSlow()); } } } 是否有一种更简单的方法可以做到这一点,即在我已经知道结果的情况下,不需要我使用委托构造任务?

您可以使用:

var tcs=new TaskCompletionSource();
SetResult(_Cache[key]);
返回tcs.Task;

(请注意,如果
\u Cache
是一个
字典
,则可以使用
TryGetValue
进行单个查找。)

如果有一个同步版本的方法返回结果,则可以执行以下操作

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

从.NET 4.5开始,您可以使用静态方法来实现以下目的:

return Task.FromResult(_Cache[key]);
public String Hello(String Name)
{
   return "Hello " + Name;
}
return Task.FromResult(_Cache[key]);