几年前实现的我的基本ViewModel为运行任务提供了这种扩展方法,同时保持UI响应*:
protected void Work(Action job)
{
IsBusy = true;
var stackTrace = new StackTrace();
var task = Task.Factory.StartNew(job)
.ContinueWith(failedTask => HandleException(failedTask, stackTrace),
TaskContinuationOptions.OnlyOnFaulted)
.ContinueWith(_ => { IsBusy = false; });
}
void HandleException(Task task, StackTrace stackTrace)
{
Dispatcher.BeginInvoke(
() => { throw new Exception(task.Exception.InnerException.ToString() +
stackTrace); });
}
IsBusy是从UI观察到的属性,用于显示进度条.
HandleExceptions背后的想法是,它们被观察然后抛入UI线程,由Main()方法中的try / catch块捕获并在向用户显示友好消息并安全关闭应用程序之前记录.传递stackTrace,因此日志包含调用者信息.
但是,我最近开始使用此Windows对话框获取有关应用程序崩溃的报告,而无需记录,也没有友好消息:
查看Windows事件日志,我们得到了这个EventData:
Application: xxxxApplication.Loader.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AggregateException
Stack: at System.Threading.Tasks.TaskExceptionHolder.Finalize()
我是否在使用ContinueWith()做错了什么?
任务异常是否可能以某种方式保持不被观察?
*:我了解BackgroundWorker.这可能在当时看起来更好,或者有其他好处.
最佳答案 我建议你处理
AppDomain.CurrentDomain.UnhandledException
要么显示您的“友好消息”或(如果这不是您的解决方案)您至少可以在此事件中记录错误,然后查看堆栈跟踪是什么来确定此“未处理”任务异常发生的位置.