在 C# 和 TPL(任务并行库)中,Task
该类表示一个正在进行的工作,它产生一个 T 类型的值。
我想知道Task.FromResult方法需要什么?
那就是:在你手头已经有了产生的价值的情况下,有什么必要将它包装回任务中?
唯一想到的是它被用作其他接受 Task 实例的方法的适配器。
在 C# 和 TPL(任务并行库)中,Task
该类表示一个正在进行的工作,它产生一个 T 类型的值。
我想知道Task.FromResult方法需要什么?
那就是:在你手头已经有了产生的价值的情况下,有什么必要将它包装回任务中?
唯一想到的是它被用作其他接受 Task 实例的方法的适配器。
我发现了两个常见的用例:
一个例子是使用缓存的方法。如果结果已经计算出来,您可以返回一个带有值的已完成任务(使用Task.FromResult
)。如果不是,那么您继续并返回代表正在进行的工作的任务。
当你想创建一个可等待的方法而不使用 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。
来自 MSDN:
当您执行返回 Task 对象的异步操作并且该 Task 对象的结果已经计算时,此方法很有用。
当您想要进行异步操作但有时结果同步在手时,请使用 Task.FromResult。您可以在这里找到一个很好的示例http://msdn.microsoft.com/en-us/library/hh228607.aspx。
我认为您可以将 Task.FromResult 用于需要很长时间才能完成的同步方法,而您可以在代码中执行其他独立工作。我宁愿让这些方法调用异步。但是想象一下您无法控制调用的代码并且您想要隐式并行处理的情况。