task.Result
をasync
メソッドで呼び出すと、デッドロックが発生する可能性があることをご理解ください。私は質問に別のひねりがありますが...タスクが完了したことを知っていれば、非同期メソッドでtask.Resultを呼び出すことはできますか?
私はこのパターンをたくさんしています。私は同じタイプの結果を返すいくつかのタスクを持っているので、それらを一度にすべて待つことができます。でも、私は別に結果を処理したい:
Task<int> t1 = m1Async();
Task<int> t2 = m2Async();
await Task.WhenAll(t1, t2);
それは私が知っているので、タスクが完了しましたが、ここではResult
を呼び出すためにOKですか?
int result1 = t1.Result;
int result2 = t2.Result;
それとも、私はまだawait
を使用する必要があります...それだけで冗長ようだと、私は結果を処理する必要があるかに応じて、ビット醜いことができます。
int result1 = await t1;
int result2 = await t2;
更新:誰かが私の質問をマークこれの複製として:Awaiting multiple Tasks with different results。 質問は異なるので、私は検索でそれを見つけられませんでしたが、そこに詳細な回答の1つが質問されるかもしれません。
はい、わかっても結果を呼び出すことは可能です。しかし、WhenAllの後に.Resultを呼び出し、t1またはt2が例外を投げた場合、.Resultは問題になります。 –
私はいくつかの投稿が例外を伴う異なる動作を指しているのを見ましたが、私はそれをすべて理解するためにはそれをさらに深く掘り下げる必要があります。迅速な対応をありがとう! – Cary
あなたが知っておくべき1つのこと。完了した状態のタスクで 'await'を呼び出すと、パフォーマンスオーバーヘッドは0になります。生成されるステートマシンは、その状態をチェックし、基本的に '.Result'を内部的に呼び出すようにスキップします(' .GetAwaiter()。GetResult() 'を実際に呼び出しますが、' .Result' )。だから、すでに 'async'とマークされているメソッドの中で' .Result'を使う魅力的な理由はありません。 –