既存のプログラムを変更する必要があり、次のコードが含まれています。
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
しかし、これは最初のすべての使用の、私にとって非常に奇妙なようだasync
し、await
選択します。スティーブン・クリアリーのこの回答によると、私はそれらを落とすことができるはずです。
次に、Select
結果を選択する2番目。これは、タスクがまったく非同期ではなく、同期的に実行される(何もしないために多大な労力を要する)ことを意味しませんか?それとも、タスクは非同期的に実行され、完了したら残りのクエリが実行されますか?
私はに応じて次のように上記のコードを記述する必要がありステファン・クリアリーによって別の答え:
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
そしてそれはこのように完全に同じですか?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
このプロジェクトに取り組んでいる間、最初のコードサンプルを変更したいのですが、(適切に機能している)非同期コードの変更にはあまり熱心ではありません。多分私は何も心配していません、そして3つのコードサンプルはすべてまったく同じことをしていますか?
ProcessEventsAsyncは次のようになります。
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
とInputResult
カスタムクラスであること。
Select
前のタスクの結果を忘れてしまいました Where
。
Result
、タスクのプロパティにアクセスせずに結果を確実に取得する必要があります