【问题标题】:Callback for 4 asynchronous methods C#回调 4 个异步方法 C#
【发布时间】:2017-03-06 07:19:08
【问题描述】:

我有 4 个异步方法在我的应用程序启动时执行。

一旦所有方法完成,我需要执行最后一行代码。因为它们都是异步执行的,我如何创建一个回调来确定最后一个方法何时完成执行?

我想过声明一个全局计数器变量,并在每次方法完成时递增它,一旦计数器达到 4,最后一行就会执行。

但我认为这会有点复杂,有没有更简单的方法?

    public async Task PerformStartupTasksAsync()
    {
        await CreateSmartsheet();

        // RUN THESE 4 ASYNCHRONOUSLY

        ImportMainDatabase();
        ImportIncomingSurveyResponse();
        ImportOutgoingSurveyResponse();
        UpdateHouseHoldListDropdown();

        // ENABLE CONTROLS HERE, AFTER 4 METHODS HAVE COMPLETED

    }

【问题讨论】:

  • 这4种方法的签名是什么?他们是async吗?
  • 这四个方法是如何异步执行的?他们是否使用并返回Tasks?他们是否明确产生线程?他们是否加入了线程池?

标签: c# asynchronous asynccallback


【解决方案1】:

首先,确保您使用 TPL 异步模型实现异步调用:返回 Task 或 Task 以异步运行所有内容。然后你可以使用下一行代码:

await Task.WhenAll(new [] {First, Second, Third, etc.});

【讨论】:

    【解决方案2】:

    使用Parallel.Invoke:

    Parallel.Invoke(
        () => ImportMainDatabase(),
        () => ImportIncomingSurveyResponse(),
        () => ImportOutgoingSurveyResponse(),
        () => UpdateHouseHoldListDropdown()
    );
    

    【讨论】:

      【解决方案3】:

      如果这 4 个方法是同步的,则无需执行任何操作。它们将连续运行。

      如果它们是异步的并且应该串行运行,则等待它们。

      如果它们是异步的并且可以同时运行,则捕获生成的任务并在它们全部完成后使用Task.WhenAll 继续。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多