在C#</tresult>中Task.FromResult <tresult>的用途是什么

时间:2013-10-24 14:06:36

标签: c# .net task-parallel-library task async-await

在C#和TPL(Task Parallel Library)中,Task类表示正在进行的工作,它产生类型为T的值。

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

那就是:在你已经掌握了产生价值的情况下,需要将它包装回任务中吗?

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

6 个答案:

答案 0 :(得分:206)

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

  1. 当您实现允许异步调用者的接口时,但您的实现是同步的。
  2. 当您对用于测试的异步代码进行存根/模拟时。

答案 1 :(得分:42)

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

缓存示例:Cache Example using Task.FromResult for Pre-computed values

答案 2 :(得分:22)

如果要在不使用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会更好。

答案 3 :(得分:18)

来自MSDN:

  

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

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

答案 4 :(得分:3)

如果要进行异步操作,请使用Task.FromResult但有时结果是同步的。你可以在http://msdn.microsoft.com/en-us/library/hh228607.aspx找到一个好的样本。

答案 5 :(得分:1)

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