web-dev-qa-db-ja.com

C#でのTask.FromResult <TResult>の使用は何ですか

C#およびTPL( タスク並列ライブラリ )では、Taskクラスは、タイプTの値を生成する進行中の作業を表します。

Task.FromResult メソッドの必要性を知りたいのですが?

つまり、生成された値を既に手元に持っているシナリオで、それをタスクにラップする必要性は何ですか?

頭に浮かぶのは、Taskインスタンスを受け入れる他のメソッドのアダプターとして使用されることだけです。

151
lysergic-acid

私が見つけた2つの一般的なユースケースがあります:

  1. 非同期の呼び出し元を許可するインターフェイスを実装しているが、実装が同期している場合。
  2. テストのために非同期コードをスタブ/モックしているとき。
208
Stephen Cleary

1つの例は、キャッシュを使用するメソッドです。結果がすでに計算されている場合、完了したタスクを値とともに返すことができます(Task.FromResultを使用)。そうでない場合は、先に進み、進行中の作業を表すタスクを返します。

キャッシュの例: 事前に計算された値にTask.FromResultを使用したキャッシュの例

42
Matt Smith

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

ここでは、Web Apiアクションで使用されるIHttpActionResultインターフェイスの独自の実装を作成しています。 ExecuteAsyncメソッドは非同期であることが期待されていますが、非同期および待機可能にするためにasyncキーワードを使用する必要はありません。すでに結果が得られており、何も待つ必要がないため、Task.FromResultを使用する方が適切です。

23
Edminsson

MSDNから:

このメソッドは、Taskオブジェクトを返す非同期操作を実行し、そのTaskオブジェクトの結果がすでに計算されている場合に役立ちます。

http://msdn.Microsoft.com/en-us/library/hh228607.aspx

18
goughy000

非同期操作が必要な場合にTask.FromResultを使用しますが、結果が同期して手元にある場合があります。ここで良いサンプルを見つけることができます http://msdn.Microsoft.com/en-us/library/hh228607.aspx

3
Alborz

コード内で他の独立した作業を行うことはできますが、完了するまでに長い時間がかかる同期メソッドにTask.FromResultを使用できると主張します。 Idではなく、これらのメソッドを作成して非同期を呼び出します。しかし、呼び出されたコードを制御できず、その暗黙的な並列処理が必要な状況を想像してください。

1
Viking