这是否可以在异步并行中运行,并且这是一种良好的编码习惯吗?

时间:2019-06-10 17:08:22

标签: c# asynchronous async-await

我正在尝试并行运行这些任务。但是我有种感觉,我做的不正确。

我尝试在Internet上查看,发现很多人都说应该避免使用.Result,但是我不知道在这种情况下该怎么做。

 var B =  SomeTaskA().
                ContinueWith(result => SomeTaskB(result.Result)).Result; //Task B depends on task A
var D =  SomeTaskC()    //Task C doesn't depend on Task A or B, so i want to run this parallel.
                .ContinueWith(result => SomeTaskD(result.Result)).Result;

            ObjectB bvalue = await B;
            ObjectD dvalue = await D;

我希望它可以并行运行,但是我不确定这是否真的发生。

1 个答案:

答案 0 :(得分:4)

您最可能想要的是同时运行它们,而不是并行运行。并发一次要做的不只是一件事情。并行将工作分散在多个线程之间。

首先,不要使用ContinueWith;使用async / await代替:

async Task AThenB()
{
  var a = await SomeTaskA();
  return await SomeTaskB(a);
}

async Task CThenD()
{
  var c = await SomeTaskC();
  return await SomeTaskD(c);
}

定义了这些方法后,可以使用await Task.WhenAll进行异步并发:

var bTask = AThenB();
var dTask = CThenD();
await Task.WhenAll(bTask, dTask);
ObjectB bValue = await bTask;
ObjectD dValue = await dTask;