在 C# 和 TPL (Task Parallel Library) 中,Task
类表示正在进行的工作,该工作产生 T 类型的值。
我想知道 Task.FromResult 方法需要什么?
那就是:在你手头已经有了产生的价值的情况下,有什么必要将它包装回任务中?
唯一想到的是它被用作其他接受 Task 实例的方法的适配器。
我发现了两个常见的用例:
当您实现一个允许异步调用者的接口时,但您的实现是同步的。当您为测试而存根/模拟异步代码时。
一个例子是使用缓存的方法。如果已经计算了结果,您可以返回一个带有值的已完成任务(使用 Task.FromResult
)。如果不是,那么您继续并返回代表正在进行的工作的任务。
缓存示例:Cache Example using Task.FromResult for Pre-computed values
Task.FromResult
返回的任务。
Task.FromResult(0)
、Task.FromResult(1)
、Task.FromResult(false)
和 Task.FromResult(true)
被缓存了。您不应该为网络访问缓存任务,但结果中的一个任务非常好。您是否愿意在每次需要返回值时创建一个?
当你想创建一个可等待的方法而不使用 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 对象的结果已经计算时,此方法很有用。
http://msdn.microsoft.com/en-us/library/hh228607.aspx
当您想要进行异步操作但有时结果同步在手时,请使用 Task.FromResult。您可以在此处找到一个很好的示例 http://msdn.microsoft.com/en-us/library/hh228607.aspx。
Task.FromResult
用于获取先前缓存的异步结果。
我认为您可以将 Task.FromResult 用于需要很长时间才能完成的同步方法,而您可以在代码中执行其他独立工作。我宁愿让这些方法调用异步。但是想象一下您无法控制调用的代码并且您想要隐式并行处理的情况。
await Task.FromResult(...)
不会进行隐式并行处理(有关说明,请参见 this question)。而是同步运行。如果您希望转换一个长时间运行的同步方法以便它可以与另一个并行调用,您应该改用 await Task.Run(() => LongRunningTask());
。
不定期副业成功案例分享
Task.FromResult
的同步服务方法和一个异步等待网络 I/O 的客户端。这样,您可以使用ChannelFactory
在客户端/服务器之间共享相同的接口。IDisposable
派生的IEnumerable<T>
- 它允许可枚举拥有一次性资源,而不是强制它。FromResult
、async
和await
都不会产生线程。Task
的方法意味着“可能是异步的”。所以有时方法被赋予一个异步签名,完全知道某些实现将是同步的(例如,NetworkStream
应该是异步的,但MemoryStream
应该是同步的)。