.NETで結果を収集します同時に、最高のC#4.5(RTM)の方法でラン2つの非同期タスクとは、私は私は2つの長時間実行されるタスクをオフに解雇したい.NET 4.5</p> <p>での作業単純なことだろうと思った何かを得るためにしばらくの間しようとしてきた4.5
で、次の作品を
結果を収集けどので、私はそれを好きではない:私は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
で、これは実際に動作し、それを行うための正しい方法です
このコードは、cal l〜Sleep(5000)
はすぐにタスクの実行を開始するので、完了するまでSleep(1000)
は実行されません。これは、Sleep
がasync
で、await
を使用していないか、または.Result
をあまりにも早く呼び出すと、当てはまります。
私は多分私は2つのタスクにStart()
を呼び出すことができますが、私は非同期の呼び出しからTask<T>
を取得する方法を見つけ出すことはできませんasync
メソッドを呼び出すことにより、非動作して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)'ではありません。これは、awaitキーワードのないSleepメソッドが同期。 – Arvis