私はしばらくの間、.NET 4.5で簡単に動作すると思われるものを試してきました。
2つの長時間実行されるタスクを同時に実行し、その
結果をC# 4.5 (RTM) の最適な方法で収集したい
以下は機能しますが、次の理由で気に入りません:
- 他のメソッド
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>
し、2 つのタスクを呼び出す方法があるかもしれないと思いましたが、非同期メソッドを呼び出して取得する方法がわかりません。async
Start()
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;
}
ベストアンサー1
async Task<int> LongTask1() {
...
return 0;
}
async Task<int> LongTask2() {
...
return 1;
}
...
{
Task<int> t1 = LongTask1();
Task<int> t2 = LongTask2();
await Task.WhenAll(t1,t2);
//now we have t1.Result and t2.Result
}