嵌套等待或异步的“过剩”

时间:2018-01-30 11:30:08

标签: c# async-await

让我们考虑下一个程序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可以优化而不会失去异步优势吗? 或者,换句话说,在嵌套调用的情况下应该等待哪些过程。第一次不期待的电话应该在哪里?感谢。

1 个答案:

答案 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