在C#和TPL(任务并行库)中,Task
该类表示正在进行的工作,该工作产生类型T的值。
我想知道Task.FromResult方法需要什么?
也就是说:在您已经掌握了生产价值的情况下,将其包装回Task的需求是什么?
唯一想到的是,它用作接受Task实例的其他方法的适配器。
在C#和TPL(任务并行库)中,Task
该类表示正在进行的工作,该工作产生类型T的值。
我想知道Task.FromResult方法需要什么?
也就是说:在您已经掌握了生产价值的情况下,将其包装回Task的需求是什么?
唯一想到的是,它用作接受Task实例的其他方法的适配器。
Answers:
我发现了两种常见的用例:
Task.FromResult
并且一个客户端正在等待网络I / O。这样,您可以使用来在客户端/服务器之间共享相同的接口ChannelFactory
。
IEnumerable<T>
衍生自IDisposable
-它允许枚举对象拥有一次性资源,而不是强制使用它。无论FromResult
,async
也不await
将产生线程。
Task
返回方法意味着“ 可以是异步的”。因此,有时会为方法提供一个异步签名,这些签名非常清楚一些实现将是同步的(例如,NetworkStream
应该是异步的,但MemoryStream
应该是同步的)。
一个例子是利用缓存的方法。如果已经计算出结果,则可以返回带有值的已完成任务(使用Task.FromResult
)。如果不是,则继续并返回代表正在进行的工作的任务。
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对象的结果已经计算出来时,此方法很有用。
当您想进行异步操作但有时结果同步进行时,请使用Task.FromResult。您可以在http://msdn.microsoft.com/zh-cn/library/hh228607.aspx中找到一个很好的示例。
Task.FromResult
用于获取先前缓存的异步结果。