そのような方法は存在しますか?
いいえ。
この目的のためだけに非同期メソッドを使用すると、オーバーヘッドはありますか?
はい。しかし、それは最も簡単な解決策です。
Task
より一般的なアプローチは、などの拡張メソッドであることに注意してくださいThen
。Stephen Toubがブログ投稿でこれを調査し、最近AsyncEx に組み込みました。
を使用するThen
と、コードは次のようになります。
public Task<TBase> Run()
{
return MethodThatReturnsDerivedTask().Then(x => (TBase)x);
}
オーバーヘッドがわずかに少ない別のアプローチは、独自のものを作成TaskCompletionSource<TBase>
し、派生結果で完了することです (TryCompleteFromCompletedTask
私の AsyncEx ライブラリを使用):
public Task<TBase> Run()
{
var tcs = new TaskCompletionSource<TBase>();
MethodThatReturnsDerivedTask().ContinueWith(
t => tcs.TryCompleteFromCompletedTask(t),
TaskContinuationOptions.ExecuteSynchronously);
return tcs.Task;
}
または (AsyncEx に依存したくない場合):
public Task<TBase> Run()
{
var tcs = new TaskCompletionSource<TBase>();
MethodThatReturnsDerivedTask().ContinueWith(t =>
{
if (t.IsFaulted)
tcs.TrySetException(t.Exception.InnerExceptions);
else if (t.IsCanceled)
tcs.TrySetCanceled();
else
tcs.TrySetResult(t.Result);
}, TaskContinuationOptions.ExecuteSynchronously);
return tcs.Task;
}