22

の機能と意味に関する違いは何ですか

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);
}
4

5 に答える 5

39

Task.FromResult は、.NET 4.5 で新しく追加されました。TaskCompletionSource を作成し、SetResult を呼び出すヘルパー メソッドです。.NET 4 以前を使用している場合は、SetResult を使用する必要があります。

于 2014-01-21T12:21:19.737 に答える
5

Task<TResult>結果のある完了 (または結果なしの完了)を返すことだけが必要な場合はTask、単に を使用しますTask.FromResult

Task.FromResult結果で完了したタスクを作成するためのシンプルなツールです。TaskCompletionSourceすべてをサポートするはるかに堅牢なツールです。例外を設定したり、未完了のタスクを返したり、結果を後で設定したりできます。

PS: 完了したタスクを返すことで非同期メソッドを「偽造」しようとしているようです。それが最善の方法ですが、「フェイク」非同期が本当に達成したいことであることを確認してください。

于 2014-01-21T11:22:39.820 に答える
3

Task.FromResult()カバーの下で非常に似たようなことをしていると確信しています。

より適切なユース ケース シナリオTaskCompletionSourceは、マルチスレッドを自分で実装した場合です。そのシナリオでは、待機可能なタスクをすぐに返します。その結果は、バックグラウンド スレッドが終了してTaskCompletionSource.SetResult()またはを呼び出すまで設定されませんTaskCompletionSource.SetException()

于 2014-01-21T11:30:25.290 に答える