在C#和TPL(Task Parallel Library)中,Task
类表示正在进行的工作,它产生类型为T的值。
我想知道Task.FromResult方法需要什么?
那就是:在你已经掌握了产生价值的情况下,需要将它包装回任务中吗?
唯一想到的是它被用作接受Task实例的其他方法的一些适配器。
答案 0 :(得分:206)
我发现了两个常见的用例:
答案 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对象的结果时,此方法很有用。
答案 4 :(得分:3)
如果要进行异步操作,请使用Task.FromResult但有时结果是同步的。你可以在http://msdn.microsoft.com/en-us/library/hh228607.aspx找到一个好的样本。
答案 5 :(得分:1)
我认为您可以将Task.FromResult用于同步方法,这些方法需要很长时间才能完成,而您可以在代码中执行其他独立的工作。我宁愿使那些方法调用异步。但是,请设想一下您无法控制所调用的代码并且想要隐式并行处理的情况。