2

我有以下代码

Task load = Task.Factory.StartNew(() => 
{
    Threading.Thread.Sleep(5000);
    throw new Exception("bad error");                
});

try{
    load.Wait();
}catch(AggregateException aex){
    MessageBox.Show("Error Caught!");
}

如您所见,我创建了一个任务并引发了异常。然后在 UI 线程上捕获异常。但是有了这个设置,用户界面将没有响应。

使 UI 响应并捕获异常的解决方法是什么?

4

2 回答 2

3

有几种方法可以处理这个问题。

您可以在那里使用ContinueWith并检查,或者您可以直接挂接到全局任务异常处理程序 TaskScheduler.UnobservedTaskException)。(详情待定)

ContinueWith 仅用于异常处理:

load.ContinueWith(previousTask => 
    {
        //exception message here
    }, TaskContinuationOptions.OnlyOnFaulted);

或使用正常的 try catch:

load.ContinueWith(previousTask => 
    {
        try
        {
            previousTask.Result
        }
        catch(Exception ex){//message here}
    });
于 2013-06-04T18:58:39.597 回答
1

您需要为任务添加延续,而不是使用Wait或任何其他阻止任务的方法。

load.ContinueWith(t => MessageBox.Show(t.Exception.Message)
    , TaskContinuationOptions.OnlyOnFaulted);
于 2013-06-04T18:59:47.980 回答