我有一个GUI应用程序,我想在一个任务中运行一些东西,所以它不会保存UI.我希望将任务中未处理的未处理异常传播到应用程序级异常处理程序.
然而:
>如果我只是在任务中抛出异常,它将无法达到应用程序级别
例外,除非我使用wait / await
> Async / Await – 我从UI构造函数调用该方法,因此我不能在那里使用async / await,因为我需要继续使用consturction.我只想运行任务而忘记.
我在考虑使用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);
}
}
最佳答案 我能想到两种方式.首先,注册到
TaskScheduler.UnobservedTaskException
事件并记录您需要的任何内容:
private void MyMethodAsync()
{
// Note you should probably register only once, so this may not fit here.
TaskScheduler.UnobservedTaskException += (s, e) => GlobalLogger.Log(e);
Task t = Task.Run(() =>
{
// Do some staff
}).ContinueWith(MyContinueWith);
}
由于某种原因你不想使用的更好的选择是实际等待操作并将其包装在try-catch中:
private async Task MyMethodAsync()
{
try
{
await Task.Run(() =>
{
// Do some staff
});
InvokeContinuation();
}
catch (Exception e)
{
// Log.
}
}