[解決済み] タスクの並列実行
2022-02-09 13:23:17
質問事項
OK、基本的に私はタスクの束(10)があり、それらをすべて同時に開始し、それらが完了するのを待ちたいと思います。完了したら、他のタスクを実行したいのです。このことについて多くのリソースを読みましたが、私の特定のケースではうまくいきません...。
現在、私が持っているものは以下のとおりです(コードは簡略化しています)。
public async Task RunTasks()
{
var tasks = new List<Task>
{
new Task(async () => await DoWork()),
//and so on with the other 9 similar tasks
}
Parallel.ForEach(tasks, task =>
{
task.Start();
});
Task.WhenAll(tasks).ContinueWith(done =>
{
//Run the other tasks
});
}
//This function perform some I/O operations
public async Task DoWork()
{
var results = await GetDataFromDatabaseAsync();
foreach (var result in results)
{
await ReadFromNetwork(result.Url);
}
}
そこで問題なのは、タスクの完了を待つために
WhenAll
の呼び出しは、どのタスクも完了していないにもかかわらず、すべてのタスクが終わったと教えてくれます。試しに
Console.WriteLine
の中に、私の
foreach
で、継続タスクを入力したところ、以前の
Task
というように、まだ終わっていないものがあります。
私はここで何を間違えているのでしょうか?
どうすればいいですか?
を使うことはほとんどありません。
Task
コンストラクタを直接使用します。あなたの場合、そのタスクは、あなたが待つことができない実際のタスクを起動するだけです。
を呼び出すだけでよい。
DoWork
で、タスクを取得し、それをリストに格納して、すべてのタスクが完了するのを待ちます。意味するところは
tasks.Add(DoWork());
// ...
await Task.WhenAll(tasks);
しかし、asyncメソッドは、未完了のタスクの最初のawaitに到達するまで同期的に実行されます。もしその部分に時間がかかりすぎるのが気になるのであれば
Task.Run
にオフロードし、別の
ThreadPool
スレッドに格納し
その
タスクをリストに追加します。
tasks.Add(Task.Run(() => DoWork()));
// ...
await Task.WhenAll(tasks);
関連
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み】複数のタスクを待機させ、異なる結果を得ることができる。
-
[解決済み】複数の非同期タスクを実行し、すべてのタスクが完了するのを待つ
-
[解決済み] .NET 4.5で2つの非同期タスクを並列に実行し、結果を収集する
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない