C#およびTPL( タスク並列ライブラリ )では、Task
クラスは、タイプTの値を生成する進行中の作業を表します。
Task.FromResult メソッドの必要性を知りたいのですが?
つまり、生成された値を既に手元に持っているシナリオで、それをタスクにラップする必要性は何ですか?
頭に浮かぶのは、Taskインスタンスを受け入れる他のメソッドのアダプターとして使用されることだけです。
私が見つけた2つの一般的なユースケースがあります:
1つの例は、キャッシュを使用するメソッドです。結果がすでに計算されている場合、完了したタスクを値とともに返すことができます(Task.FromResult
を使用)。そうでない場合は、先に進み、進行中の作業を表すタスクを返します。
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を使用する方が適切です。
MSDNから:
このメソッドは、Taskオブジェクトを返す非同期操作を実行し、そのTaskオブジェクトの結果がすでに計算されている場合に役立ちます。
非同期操作が必要な場合にTask.FromResultを使用しますが、結果が同期して手元にある場合があります。ここで良いサンプルを見つけることができます http://msdn.Microsoft.com/en-us/library/hh228607.aspx 。
コード内で他の独立した作業を行うことはできますが、完了するまでに長い時間がかかる同期メソッドにTask.FromResultを使用できると主張します。 Idではなく、これらのメソッドを作成して非同期を呼び出します。しかし、呼び出されたコードを制御できず、その暗黙的な並列処理が必要な状況を想像してください。