私はしばらくの間、.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>
呼び出して実行しないようにする方法があるのではないかと思った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;
}
task1.Result
しているvar task1 = Sleep(5000)
ため、ブロックはnot atで発生しています。