xamarin - 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();
....
} ```
解决方案
在同步函数中不正确地调用异步任务可能会出现问题,因为如果在任务中引发异常,它会抑制详细信息。因此,正确实施这一常见问题至关重要。
您可以使用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);
}
推荐阅读
- python - 从下拉菜单或按钮 Python/Plotly 将 sqrt 设置为 yaxis 比例
- php - AWS Personalize — algorithmHyperParameters 必须是关联数组。找到数组
- php - 在“提交”按钮后替换数据
- r - R - 使用 lapply 后需要不同的结果
- filebeat - Podman 记录文件节拍
- csv - 匹配日期以报告审查时间表
- excel - Blueprism Excel 对象中的 OpenText 操作不再适用于 Office365
- spring - SpringBoot不从依赖库加载属性
- swagger - 在 Micronaut 中设置 Swagger 配置
- excel - 在 Outlook 主题行中插入日期:“找不到项目或库。”