[解決済み] .NET 4.5で2つの非同期タスクを並列に実行し、結果を収集する
2022-06-22 11:16:58
質問
私は、簡単だと思われるものを.NET 4.5で動作させるために、しばらく試してきました。
私は、2 つの長く実行されているタスクを同時に起動し、そのタスクから
以下は動作しますが、私はこれが好きではありません。
-
私は
Sleep
を非同期メソッドにすることです。await
他のメソッド -
で不器用に見えるだけです。
Task.Run()
- これでは、新しい言語機能を全く使っているとは思えませんね
動作中のコードです。
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Task.Run(() => Sleep(5000));
var task2 = Task.Run(() => Sleep(3000));
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for a total of " + totalSlept + " ms");
}
private static int Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
Console.WriteLine("Sleeping for " + ms + " FINISHED");
return ms;
}
動作しないコードです。
更新:これは実際に動作し、正しい方法です。
Thread.Sleep
このコードが動作しないのは
Sleep(5000)
を呼び出すとすぐにタスクの実行を開始するので
Sleep(1000)
はそれが完了するまで実行されません。これは
Sleep
は
async
となっており、私は
await
を呼び出したり
.Result
が早すぎる。
もしかしたらと思い、実行されていない
Task<T>
を呼び出すことで
async
メソッドを呼び出すことで
Start()
を呼び出すことができるのですが、2つのタスクに対して
Task<T>
を取得する方法がわかりません。
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Sleep(5000); // blocks
var task2 = Sleep(1000);
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for " + totalSlept + " ms");
}
private static async Task<int> Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
return ms;
}
どのように解決するのですか?
非同期プログラミングでSleepの代わりにTask.Delayを使用し、Task.WhenAllでタスクの結果を結合する必要があります。タスクは並列に実行されることになります。
public class Program
{
static void Main(string[] args)
{
Go();
}
public static void Go()
{
GoAsync();
Console.ReadLine();
}
public static async void GoAsync()
{
Console.WriteLine("Starting");
var task1 = Sleep(5000);
var task2 = Sleep(3000);
int[] result = await Task.WhenAll(task1, task2);
Console.WriteLine("Slept for a total of " + result.Sum() + " ms");
}
private async static Task<int> Sleep(int ms)
{
Console.WriteLine("Sleeping for {0} at {1}", ms, Environment.TickCount);
await Task.Delay(ms);
Console.WriteLine("Sleeping for {0} finished at {1}", ms, Environment.TickCount);
return ms;
}
}
関連
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】複数の非同期タスクを実行し、すべてのタスクが完了するのを待つ
-
[解決済み] .Net 4.5の非同期HttpClientは負荷の高いアプリケーションには不向きか?
最新
-
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#
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である