让我们考虑下一个程序hierarhy
Main.cs:
// timer callback
{
Plot.UpdateData();
}
Plot.cs:
public async void UpdateData()
{
await CalculateData();
// ...
}
private async Task CalculateData()
{
await Calculations.Calculate();
// UI updating
// ...
}
Calculations.cs:
public static async Task<bool> Calculate()
{
async Task<bool> CalculateLR()
{
var task1 = Calculate1();
var task2 = Calculate2();
await Task.WhenAll(new[] { task1, task2 });
return true;
}
var leftTask = CalculateLR();
var rightTask = CalculateLR();
await Task.WhenAll(new[] { leftTask, rightTask });
await Calculate3();
return true;
}
这里我有Calculate1-Calculate3
文件的一些基本计算(在Calculations.cs
程序中)和一些与UI的交互。 “入口点”Plot.UpdateData
位于主窗体的Device.StartTimer(
块中。
它有效,但我认为这种结构会产生多余的线程。所以我的问题是这个hierarhy可以优化而不会失去异步优势吗? 或者,换句话说,在嵌套调用的情况下应该等待哪些过程。第一次不期待的电话应该在哪里?感谢。
答案 0 :(得分:1)
首先要注意的是:async / await是关于任务,而不是线程。在某些情况下,任务可以是线程等效的,并且在大多数情况下它不是(相同的线程可以按顺序传送器式服务很多任务,具体取决于它们如何被安排继续以及等待条件,例如)。
我强烈建议将此作为非常全面的来源进一步阅读: https://blog.stephencleary.com/2013/11/there-is-no-thread.html https://blog.stephencleary.com/2014/05/a-tour-of-task-part-1-constructors.html