UI线程弹窗异常处理:await在非异步Lambda中编译报错求解
问题解决办法
核心问题
你碰到的编译器报错和异步规范问题,本质是两个lambda缺少async修饰符:
Task.Run里的lambda用了await,但没标记async,编译器识别不了这是异步逻辑- 虽然当前
Dispatcher.InvokeAsync里的代码是同步的,但要符合异步最佳实践,内部lambda也建议加上async,方便后续扩展异步操作
修正后的代码
await Task.Run(async () => // 给外层lambda添加async修饰符 { try { DoTheThing(); } catch (Exception e) { // 给Dispatcher的内部lambda加上async,兼容后续异步操作 await Dispatcher.UIThread.InvokeAsync(async () => { var messageBoxStandardWindow = MessageBox.Avalonia.MessageBoxManager .GetMessageBoxStandardWindow("Exception", e.Message); messageBoxStandardWindow.Show(); Reset(); }); } });
关键说明
- 给
Task.Run的lambda加async,是因为里面用到了await,必须让编译器识别这是一个异步任务,否则会触发报错 - 给
Dispatcher.InvokeAsync的lambda加async,属于异步编程的最佳实践——哪怕当前逻辑是同步的,后续如果要在弹窗流程里添加异步操作(比如等待用户确认后调用异步接口),就不用再修改修饰符 - 这样修改后,既保证弹窗在UI线程安全执行、异常能被正确捕获,又完全符合异步编程规范,不会再出现崩溃或编译器报错
内容的提问来源于stack exchange,提问作者user20510170
相关产品推荐
相关产品推荐

