【发布时间】:2020-03-27 14:01:03
【问题描述】:
在我的一种方法中,我想创建这样一辆汽车:
public string[] CreateCar()
{
string[] wheels = CreateWheels();
// Also add motor and other stuff here
string[] motor = ...;
return new string[][]{ wheels, motor, ... };
}
这里创建了四个轮子,它们彼此不依赖。
因此,我可以将它们放在多个tasks 中,并进行并行化。 (在我的真实代码中,使用并行循环是不可能的)
public string[] CreateWheels()
{
Task FL = Task.Run(() => CreateWheel("front left");
Task FR = Task.Run(() => CreateWheel("front right");
Task BL = Task.Run(() => CreateWheel("back left");
Task BR = Task.Run(() => CreateWheel("back right");
// Here I really want to wait for all wheels to be created!
// STOP THE PROCESS HERE UNTIL ALL WHEELS ARE COMPLETED!!!
string[] wheels = await Wask.WhenAll(FL, FR, BL, BR);
return wheels;
}
一个单独的轮子是这样创建的:
public string CreateWheel(string position)
{
// Here a wheel is created, whatever it takes :)
return "wheel " + position;
}
我现在的问题如下:
为了编译代码,它迫使我将CreateWheels 标记为async-Method。否则我不能使用await。
⇒ 但这迫使我将其返回值更改为 Task<string[]>
⇒ 但是,然后我需要在CreateCar-Method 中的CreateWheels() 前面放置一个await,以便获取字符串数组而不是任务本身
⇒然后循环重复,因为现在,CreateWheels中有一个await,迫使我使它成为async ...等等,等等...
这个循环一直重复,直到最终到达void 方法,您不需要使用await 提取返回值
如果我只想等待所有轮子在标记点完成,那么这个循环的出路是什么?
【问题讨论】:
-
除非
CreateCar是一种要求特殊性的方法,否则我不明白您为什么要使用Task.Run来执行它。 -
string[] wheels = Task.WhenAll(FL, FR, BL, BR).Result;应该可以工作 -
@UnholySheep:哦,太好了!那么所有任务仍然并行执行吗?
-
有什么理由不想让代码async all the way down?
-
正如其他人所提到的,异步在某种程度上往往具有“传染性”。根据这段代码的嵌套程度,交换所有内容可能会有点痛苦,但它比尝试调试在 IMO 任务上使用
.Result可能最终遇到的任何死锁条件更痛苦。跨度>
标签: c# asynchronous async-await task