【发布时间】:2016-01-13 18:30:39
【问题描述】:
我有一个 GUI 应用程序,我想在其中运行任务中的某些内容,因此它不会保留 UI。我希望将任务中未处理的异常传播到应用程序级异常处理程序。 然而:
- 如果我只是在任务中抛出异常,它不会达到应用程序级别 除非我使用等待/等待,否则例外
- Async/Await - 我从 UI 构造函数调用该方法,所以我不能在那里使用 async/await,因为我需要继续构建。我只想运行任务并忘记。
我在考虑使用 dispatcher.invoke,你怎么看?
public MainWindow()
{
InitializeComponent();
MyMethodAsync();
InitializeA();
IntiializeB();
}
private void MyMethodAsync()
{
Task t = Task.Run(() =>
{
//Do some stuff
throw new Exception("Throwing some unexpected exception");
}).ContinueWith(MyContinueWith);
}
private void MyContinueWith(Task task)
{
if (task.IsFaulted && task.Exception != null)
{
dispatcher.BeginInvoke(new Action(() =>
{
throw task.Exception;
}), null);
}
}
【问题讨论】:
-
按照惯例,后缀为“Async”的方法通常是返回已启动任务的方法。使用 async/await 关键字,这对调用者来说是自动处理的,实现并不重要。
-
@skippy:
await不会阻止您的用户界面。听起来await正是您想要的行为。 -
你为什么使用
Task.ContinueWith?真的不推荐,你应该改用 C#5await。仅调试潜力就让使用Task.continueWith变得疯狂。 -
感谢您的快速解答。我不想使用 await 的原因是我想在 UI 线程上运行的构造函数中使用 MyMethodAsync。所以我不要等待和等待我的窗口的建设。 (我不能使构造函数异步)
-
我已经用这条评论编辑了问题