正确的方式来运行两个任务

时间:2016-08-17 22:01:23

标签: c# multithreading asynchronous async-await

我想知道这种方法是否可以并行运行两个长时间运行的操作,然后获得结果是正确的,如果使用async / await会有任何优势。

        public int DoStuff()
        {
            var res1 = Task.Run(() => LongRunning1());
            var res2 = Task.Run(() => LongRunning2());

            Task.WhenAll(res1, res2);
            return res1.Result + res2.Result;
        }

        int LongRunning1()
        {
            Thread.Sleep(30);
            return 10;
        }

        int LongRunning2()
        {
            Thread.Sleep(10);
            return 20;
        }

1 个答案:

答案 0 :(得分:4)

以这种方式并行运行任务很好。 WhenAll行无效,可以删除。另请注意,Result将在AggregateException中包含任何例外;运行并行代码时这是正常的。

public int DoStuff()
{
  var res1 = Task.Run(() => LongRunning1());
  var res2 = Task.Run(() => LongRunning2());

  return res1.Result + res2.Result;
}

但是,如果任务是自然异步的(例如,I / O绑定),那么您可以执行并发异步代码而不是 parallel 代码:

async Task<int> LongRunning1Async()
{
  await Task.Delay(30);
  return 10;
}

async Task<int> LongRunning2Async()
{
  await Task.Delay(10);
  return 20;
}

public async Task<int> DoStuffAsync()
{
  var res1 = LongRunning1Async();
  var res2 = LongRunning2Async();

  return await res1 + await res2;
}

或者,或者:

public async Task<int> DoStuffAsync()
{
  var res1 = LongRunning1Async();
  var res2 = LongRunning2Async();

  var results = await Task.WhenAll(res1, res2);
  return results[0] + results[1];
}