.NET 4.5 で 2 つの非同期タスクを並列実行し、結果を収集する 質問する

.NET 4.5 で 2 つの非同期タスクを並列実行し、結果を収集する 質問する

私はしばらくの間、.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、あまり早く呼び出していない場合でも、これは当てはまります。asyncawait.Result

メソッドを呼び出して非実行を取得Task<T>し、2 つのタスクを呼び出す方法があるかもしれないと思いましたが、非同期メソッドを呼び出して取得する方法がわかりません。asyncStart()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
}

おすすめ記事