任务FromResult与TaskCompletionSource SetResult

Pas*_*cal 19 c# task-parallel-library async-await asp.net-web-api taskcompletionsource

有关功能和含义的区别是什么

TaskCompletionSource + SetResult vs Task + 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);
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*ler 35

Task.FromResult是.NET 4.5中的新增功能.它是一个帮助方法,它创建一个TaskCompletionSource并调用SetResult.如果您使用的是.NET 4或更早版本,则必须使用SetResult.

  • `Task.FromResult`不使用`TaskCompletionSource`.`Task.FromResult`调用_Special内部构造函数来创建一个已经完成的task_.[来自源代码评论](http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs,11a386e7d7cae64a). (3认同)
  • @Miller 请更新您的答案,以包括 Fabio 的澄清。 (3认同)

i3a*_*non 5

如果您只想返回一个Task<TResult>有结果的完成(或一个Task没有结果的完成),只需使用Task.FromResult.

Task.FromResult是一个简单的工具来创建一个完成的任务的结果。TaskCompletionSource是一个更强大的工具,支持一切。您可以设置异常,返回未完成的任务并稍后设置其结果等等

PS:似乎您试图通过返回已完成的任务来“伪造”异步方法。尽管这是最好的方法,但请确保“伪造”异步确实是您想要完成的。