いくつかの非同期関数を備えたインターフェースがあります。
メソッドが戻るTask
と思います。async
は実装の詳細であるため、インターフェイスメソッドには適用できません。
インターフェイスを実装するクラスの中には、待つものがないものもあれば、単にスローするものもあります。
このような場合、async
実装の詳細であるという事実を利用できます。
あなたがするものが何もない場合await
、あなたはただ戻ることができますTask.FromResult
:
public Task<int> Success() // note: no "async"
{
... // non-awaiting code
int result = ...;
return Task.FromResult(result);
}
を投げる場合NotImplementedException
、手順はもう少し言葉になります。
public Task<int> Fail() // note: no "async"
{
var tcs = new TaskCompletionSource<int>();
tcs.SetException(new NotImplementedException());
return tcs.Task;
}
スローするメソッドがたくさんある場合NotImplementedException
(それ自体が、設計レベルのリファクタリングが適切であることを示している可能性があります)、冗長性をヘルパークラスにまとめることができます。
public static class TaskConstants<TResult>
{
static TaskConstants()
{
var tcs = new TaskCompletionSource<TResult>();
tcs.SetException(new NotImplementedException());
NotImplemented = tcs.Task;
}
public static Task<TResult> NotImplemented { get; private set; }
}
public Task<int> Fail() // note: no "async"
{
return TaskConstants<int>.NotImplemented;
}
ヘルパークラスは、同じリターンタイプの各メソッドがオブジェクトを共有できるため、GCが収集しなければならないガベージも削減しTask
ますNotImplementedException
。
AsyncExライブラリには、他にもいくつかの「タスク定数」タイプの例があります。