我试图实现代码并行运行两个任务。任务返回的值被赋给两个不同的局部变量,这些值需要在任务完成后使用。
这就是我拥有的:
var return1 = new ReturnType1();
var task1 = Task.Run(async() =>
{
return1 = await MyAPI.GetSomeData(param1);
});
var return2 = new ReturnType2();
var task2 = Task.Run(async() =>
{
return2 = await MyApi.GetSomeOtherData(param2);
});
var tasks = new List<Task>();
tasks.Add(task1);
tasks.Add(task2);
await Task.WhenAll(tasks);
bool isNotNullReturn1 = return1 != null;
bool isNotNullReturn2 = return2 != null;
// And just to check return types have been assigned
Console.WriteLine($"{isNotNullReturn1.ToString(), {isNotNullReturn2.ToString()}}");
这些任务是否并行运行?
我不确定在各个任务中的等待会发生什么?它们会在单独的后台线程上运行,每个线程并行地等待各自的结果,从而按照期望的方式运行吗?或者它们是否会因为等待而按顺序运行?单独的问题,但我的研究还没有弄清楚。做"await"总是创建一个单独的线程,而不是UI,就像"Task.Run">
?
这是正确的方法吗?请通知/正确的。
这些任务是否并行运行?
它们将并发运行,是。
我不确定在各个任务中的等待会发生什么?它们会在单独的后台线程上运行,每个线程并行地等待各自的结果,从而按照期望的方式运行吗?或者它们是否会因为等待而按顺序运行?
await
在其当前方法中按顺序操作。在本例中,该方法只是传递给Task.Run
的委托。因此,一个代表中的await
与另一个代表中的await
无关。
单独的问题,但我的研究还没有弄清楚。做"await"总是创建一个单独的线程,而不是UI,就像"Task.Run">
?
号
这是正确的方法吗?请通知/正确的。
目前,这段代码有点复杂:
var task1 = Task.Run(async() =>
{
return1 = await MyAPI.GetSomeData(param1);
});
它将工作(委托)发送给后台线程,然后该工作异步运行(允许后台线程返回线程池)。假设GetSomeData
是真正异步的(即,不阻塞调用线程),那么后台线程是多余的;不需要Task.Run
。
我会这样写:
var task1 = MyAPI.GetSomeData(param1);
var task2 = MyApi.GetSomeOtherData(param2);
await Task.WhenAll(task1, task2);
var return1 = await task1;
var return2 = await task2;