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

发布于 2024-10-12 05:14:56 字数 482 浏览 3 评论 0原文

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

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

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

I have a method which returns a Task where the implementation may or may not need to perform a slow operation in order to retrieve the result. I would like to be able to simply wrap the result value into a Task which is marked as having completed synchronously in the case where the value is already available. Today I have something like this:

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

Is there is simpler way to do this that doesn't require me to construct the task with a delegate when I already know the result?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

吾性傲以野 2024-10-19 05:14:56

从 .NET 4.5 开始,您可以使用 < code>Task.FromResult()静态方法正是用于此目的:

return Task.FromResult(_Cache[key]);

Beginning with .NET 4.5, you can use the Task.FromResult<T>() static method for exactly this purpose:

return Task.FromResult(_Cache[key]);
九八野马 2024-10-19 05:14:56

您可以使用 TaskCompletionSource:(

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

请注意,如果_Cache 是一个 Dictionary,您可以使用 TryGetValue 使其成为单个查找。)

You could use a TaskCompletionSource<TResult>:

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

(Note that if _Cache is a Dictionary<TKey, TValue> you could use TryGetValue to make it a single lookup.)

以往的大感动 2024-10-19 05:14:56

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

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

hello 方法如下所示。

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

If you have a synchronous version of the method that returns the result you can do the following

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

The hello method would look like below.

public String Hello(String Name)
{
   return "Hello " + Name;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文