226

在 C# 和 TPL(任务并行库)中,Task该类表示一个正在进行的工作,它产生一个 T 类型的值。

我想知道Task.FromResult方法需要什么?

那就是:在你手头已经有了产生的价值的情况下,有什么必要将它包装回任务中?

唯一想到的是它被用作其他接受 Task 实例的方法的适配器。

4

6 回答 6

316

我发现了两个常见的用例:

  1. 当您实现一个允许异步调用者的接口时,但您的实现是同步的。
  2. 当您为测试而存根/模拟异步代码时。
于 2013-10-31T00:40:47.987 回答
59

一个例子是使用缓存的方法。如果结果已经计算出来,您可以返回一个带有值的已完成任务(使用Task.FromResult)。如果不是,那么您继续并返回代表正在进行的工作的任务。

缓存示例:将 Task.FromResult 用于预计算值的缓存示例

于 2013-10-24T14:19:36.940 回答
35

当你想创建一个可等待的方法而不使用 async 关键字时使用它。我找到了这个例子:

public class TextResult : IHttpActionResult
{
    string _value;
    HttpRequestMessage _request;

    public TextResult(string value, HttpRequestMessage request)
    {
        _value = value;
        _request = request;
    }
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage()
        {
            Content = new StringContent(_value),
            RequestMessage = _request
        };
        return Task.FromResult(response);
    }
}

在这里,您将创建自己的 IHttpActionResult 接口实现,以在 Web Api Action 中使用。ExecuteAsync 方法应该是异步的,但您不必使用 async 关键字使其异步且可等待。由于您已经有了结果并且不需要等待任何东西,因此最好使用 Task.FromResult。

于 2015-08-03T15:31:54.480 回答
25

来自 MSDN:

当您执行返回 Task 对象的异步操作并且该 Task 对象的结果已经计算时,此方法很有用。

http://msdn.microsoft.com/en-us/library/hh228607.aspx

于 2013-10-24T14:26:20.477 回答
6

当您想要进行异步操作但有时结果同步在手时,请使用 Task.FromResult。您可以在这里找到一个很好的示例http://msdn.microsoft.com/en-us/library/hh228607.aspx

于 2013-12-08T07:05:09.113 回答
-1

我认为您可以将 Task.FromResult 用于需要很长时间才能完成的同步方法,而您可以在代码中执行其他独立工作。我宁愿让这些方法调用异步。但是想象一下您无法控制调用的代码并且您想要隐式并行处理的情况。

于 2018-12-28T08:17:40.453 回答