非同期にコードを実行する場合(async/awaitなど)、適切なタスクが必要です。もちろん、最も頻繁な操作をカバーするフレームワークにはいくつかの事前定義されたメソッドがありますが、時には自分のものを書きたいと思っています。私はC#を初めて使っているので、間違っている可能性はかなり高いですが、少なくとも私の現在の慣行には完全に満足していません。 私がやっている何のために以下の例を参照してください:一般的にカスタムタスクを正しく返す方法
public async Task<bool> doHeavyWork()
{
var b1 = await this.Foo();
//var b2 = await Task<bool>.Factory.StartNew(Bar); //using Task.Run
var b2 = await Task.Run(()=>Bar());
return b1 & b2;
}
public Task<bool> Foo()
{
return Task.Factory.StartNew(() =>
{
//do a lot of work without awaiting
//any other Task
return false;
});
}
public bool Bar()
{
//do a lot of work without awaiting any other task
return false;
}
を私が作成し、Fooの例のように、このような方法を消費しますが、見ていないメソッド全体のロジックを含む「余分な」ラムダがあります非常にかわいいイホ。もう一つの選択肢は、Barの例のようなメソッドを消費することですが、BarAsyncのような適切なメソッド名を除いてこのメソッドを非同期で実行し、Task.Factory.StartNewを実行する必要があることが明らかでないため、プログラムで数回繰り返されます。コンパイラにこのメソッドがタスクを返すようにする方法はわかりません。私がやりたいことは、呼び出されたときにタスク全体に包んでください。
最後に私の質問:このような方法を書くにはどうすればよいですか?追加のラムダを取り除くことはできますか?
EDIT Servyが述べたように、メソッドの同期バージョンを使用するのは正当な理由があります。非同期バージョンは、絶対必要な場合にのみ提供する必要があります(Stephen Clearyのリンク)。
'を追加することなく、もちろん「なぜオプションとして拒否するのですか? 'public bool Bar'と' public task BarAsync'を作成します。 –
Servy
オーバーヘッドを避けたい。同期または非同期のいずれかの方法を使用することが合理的であれば、それは問題ありません。そうでなければ、パブリックBarAsyncとプライベートバー(それを隠すため)があり、この場合はそれほど理由はありません。 – marce