运行两个任务的正确方法

本文关键字:方法 任务 两个 运行 | 更新日期: 2023-09-27 18:02:55

我想知道这种方法并行运行两个长时间运行的操作,然后得到他们的结果是正确的,如果有任何优势使用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;
        }

运行两个任务的正确方法

以这种方式并行运行任务是可以的。WhenAll线不做任何事情,可以移除。还要注意,Result将在AggregateException中包装任何异常;这在运行并行代码时是正常的。

public int DoStuff()
{
  var res1 = Task.Run(() => LongRunning1());
  var res2 = Task.Run(() => LongRunning2());
  return res1.Result + res2.Result;
}
然而,如果任务是自然异步的(例如,I/o绑定),那么您可以使用并发异步代码来代替并行代码:
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];
}