关于的功能和意义有什么不同
TaskCompletionSource + SetResult vs任务+ FromResult
在SendAsync方法中?
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
var response = new HttpResponseMessage(HttpStatusCode.Forbidden) {ReasonPhrase = "HTTPS Required"};
var taskCompletionSource = new TaskCompletionSource<HttpResponseMessage>();
taskCompletionSource.SetResult(response);
return taskCompletionSource.Task;
}
return base.SendAsync(request, cancellationToken);
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (!request.RequestUri.Scheme.Equals(Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase))
{
HttpResponseMessage reply = request.CreateErrorResponse(HttpStatusCode.BadRequest, "HTTPS is required for security reason.");
return Task.FromResult(reply);
}
return base.SendAsync(request, cancellationToken);
}
发布于 2014-01-21 20:21:20
Task.FromResult是.NET 4.5中的一个新功能。它是创建TaskCompletionSource并调用SetResult的帮助器方法。如果您使用的是.NET 4或更早版本,则必须使用SetResult。
发布于 2014-01-21 19:22:40
如果您想要的只是返回一个带有结果的完整Task<TResult>
(或者返回一个没有结果的完整Task
),那么只需使用Task.FromResult
。
Task.FromResult
是一个用于创建具有结果的已完成任务的简单工具。TaskCompletionSource
是一个更加健壮的工具,它支持一切。您可以设置异常,返回未完成的任务,并在以后设置其结果,等等
附言:看起来你试图通过返回一个已完成的任务来“伪造”异步方法。虽然这是最好的方法,但要确保“伪造”异步是你真正想要完成的。
发布于 2014-01-21 19:30:25
我非常确定Task.FromResult()
在幕后做了一些非常类似的事情。
TaskCompletionSource
的一个更好的用例场景是您自己实现了多线程。在这种情况下,您会立即返回一个可等待的任务,直到后台线程完成并调用TaskCompletionSource.SetResult()
或TaskCompletionSource.SetException()
时才会设置其结果。
https://stackoverflow.com/questions/21256110
复制相似问题