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());
    }
  }
}

有没有更简单的方法来做到这一点,当我已经知道结果时,不需要我使用委托来构建任务?

解决方法

你可以使用 TaskCompletionSource<TResult>
var tcs = new TaskCompletionSource<Foo>();
tcs.SetResult(_Cache[key]);
return tcs.Task;

(请注意,如果_Cache是​​Dictionary< TKey,TValue>,您可以使用TryGetValue进行单次查找.)

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...