[解決済み] LINQを使ってタスクのリストを非同期で待ち受けるには?
2023-02-18 19:55:52
質問
このように作成したタスクのリストがあります。
public async Task<IList<Foo>> GetFoosAndDoSomethingAsync()
{
var foos = await GetFoosAsync();
var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList();
...
}
を使うことで
.ToList()
を使うことで、タスクはすべて開始されるはずです。あとは完了を待って結果を返せばいい。
これは、上記の
...
ブロックの中で動作します。
var list = new List<Foo>();
foreach (var task in tasks)
list.Add(await task);
return list;
これは私が望むことをやってくれますが、かなり不器用な感じがします。むしろこのようなもっとシンプルなものを書きたいのです。
return tasks.Select(async task => await task).ToList();
... しかし、これはコンパイルされません。何が足りないのでしょうか?それとも、このように表現することができないだけなのでしょうか?
どのように解決するのですか?
LINQが完全に動作しないのは
async
のコードでは完全に動作しませんが、このようにすることができます。
var tasks = foos.Select(DoSomethingAsync).ToList();
await Task.WhenAll(tasks);
もし、タスクがすべて同じ型の値を返すのであれば、このようなことも可能です。
var results = await Task.WhenAll(tasks);
というのは、なかなかいい感じです。
WhenAll
は配列を返すので、あなたのメソッドは結果を直接返すことができると思います。
return await Task.WhenAll(tasks);
関連
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み] LINQを使用してList<T>から要素を削除する
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] LINQ を使用して、ある List<> にある項目を別の List<> にない項目として取得する。
-
[解決済み] LINQを使用してList<string>内のすべての文字列を結合する
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#で四捨五入する方法
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み] 2つのリストを結合する
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】linq selectで非同期await。