在c#和TPL(任务并行库)中,Task类表示一个正在进行的工作,该工作产生类型为T的值。
我想知道这个任务需要什么。FromResult方法?
也就是说:在您已经拥有生产价值的场景中,有什么必要将其重新包装到任务中?
唯一想到的是,它被用作接受Task实例的其他方法的适配器。
在c#和TPL(任务并行库)中,Task类表示一个正在进行的工作,该工作产生类型为T的值。
我想知道这个任务需要什么。FromResult方法?
也就是说:在您已经拥有生产价值的场景中,有什么必要将其重新包装到任务中?
唯一想到的是,它被用作接受Task实例的其他方法的适配器。
当前回答
我发现有两个常见的用例:
当您实现一个允许异步调用者的接口,但您的实现是同步的。 当您为测试而存根/模拟异步代码时。
其他回答
我认为你可以使用Task。FromResult用于同步方法,当您可以在代码中执行其他独立工作时,需要很长时间才能完成。我宁愿让这些方法异步调用。但是想象一下这样一种情况,您无法控制所调用的代码,而您想要隐式并行处理。
我发现有两个常见的用例:
当您实现一个允许异步调用者的接口,但您的实现是同步的。 当您为测试而存根/模拟异步代码时。
使用任务。FromResult当你想要进行异步操作时,但有时结果是同步的。你可以在这里找到一个很好的例子http://msdn.microsoft.com/en-us/library/hh228607.aspx。
当您想创建一个可等待的方法而不使用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);
}
}
在这里,您正在创建用于Web Api动作的IHttpActionResult接口的自己的实现。ExecuteAsync方法预期是异步的,但您不必使用async关键字来使其成为异步和可等待的。因为你已经有了结果,不需要等待任何东西,所以最好使用Task.FromResult。
使用Task创建预计算任务。FromResult:
当您执行返回Task对象的异步操作,并且该Task对象的结果已经计算出来时,此方法非常有用。