我正在尝试并行运行这些任务。但是我有种感觉,我做的不正确。
我尝试在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;
我希望它可以并行运行,但是我不确定这是否真的发生。
答案 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;