首页 > 解决方案 > C#从非异步方法调用时等待所有异步任务完成

问题描述

我在 Xamarin Forms 项目的构造函数中有以下代码 - 我希望在调用 ShowPage() 方法之前完成每个步骤(它基本上是从 web 服务加载数据) - 这会起作用还是有更好的方法来实现这一点?

public MyTabbedPage()
 {
    ....
     Task.Run(async () => await vm1.LoadData();
     Task.Run(async () => await vm2.LoadData();
     Task.Run(async () => await vm3.LoadData();

     ShowPage();
     ....
 } ```

标签: xamarinasynchronousxamarin.formsasync-awaittask

解决方案


在同步函数中不正确地调用异步任务可能会出现问题,因为如果在任务中引发异常,它会抑制详细信息。因此,正确实施这一常见问题至关重要。

您可以使用FireAndForget放置在 TaskHelpers.cs 下的 Helpers 文件夹中的帮助程序,定义如下:

    public static async void FireAndForgetSafeAsync(this Task task, Action<Exception> handleErrorAction = null)
    {
        try
        {
            await task.ConfigureAwait(true);
        }
        catch (Exception ex)
        {
            handleErrorAction?.Invoke(ex);
        }
    }

然后,回到你的构造函数中,你可以这样做:

 public MyTabbedPage()
 {
     vm1.LoadData().FireAndForgetSafeAsync(HandleErrorInternal);
     vm2.LoadData().FireAndForgetSafeAsync(HandleErrorInternal);
     vm3.LoadData().FireAndForgetSafeAsync(HandleErrorInternal);
     ShowPage();
 }

 private void HandleErrorInternal(Exception ex)
 {
     DisplayAlertAsync("Error", ex.ToString(), "OK").FireAndForgetSafeAsync(HandleErrorInternal);
 }

推荐阅读