C#およびTPL(Task Parallel Library)では、Task
クラスはT型の値を生成する進行中の作業を表します。
Task.FromResultメソッドの必要性は何ですか?
つまり、すでに生成された値を手元に持っているシナリオで、それをタスクにラップする必要性は何ですか?
頭に浮かぶのは、Taskインスタンスを受け入れる他のメソッドのアダプターとして使用されることだけです。
C#およびTPL(Task Parallel Library)では、Task
クラスはT型の値を生成する進行中の作業を表します。
Task.FromResultメソッドの必要性は何ですか?
つまり、すでに生成された値を手元に持っているシナリオで、それをタスクにラップする必要性は何ですか?
頭に浮かぶのは、Taskインスタンスを受け入れる他のメソッドのアダプターとして使用されることだけです。
回答:
私が見つけた2つの一般的な使用例があります。
Task.FromResult
、ネットワークI / Oを非同期的に待機するクライアントを使用できます。これにより、を使用してクライアント/サーバー間で同じインターフェースを共有できますChannelFactory
。
IEnumerable<T>
派生するのに似てIDisposable
います -それは強制的にではなく、列挙型が使い捨てのリソースを持つことを可能にします。どちらもFromResult
、async
、もawait
のスレッドを生成しません。
Task
-returningメソッドは「非同期かもしれません」を意味します。したがって、メソッドには、一部の実装が同期することを十分に理解している非同期シグネチャが与えられることがあります(たとえば、NetworkStream
非同期であるMemoryStream
必要がありますが、同期する必要があります)。
1つの例は、キャッシュを利用するメソッドです。結果がすでに計算されている場合は、値を使用して完了したタスクを返すことができます(を使用Task.FromResult
)。そうでない場合は、先に進み、進行中の作業を表すタスクを返します。
Task.FromResult
キャッシュできます。
Task.FromResult(0)
、Task.FromResult(1)
、Task.FromResult(false)
およびTask.FromResult(true)
キャッシュされます。ネットワークアクセスのタスクをキャッシュすることは想定されていませんが、結果からのタスクは完全に問題ありません。値を返す必要があるたびに作成しますか?
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
以前にキャッシュされた非同期結果を取得するために使用されます。