私はしばらくの間、.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;
}