我正在使用以下内容
Task.Factory.StartNew(() => DoPrintConfigPage(serial));
然后我调用的函数看起来像这样
private void DoPrintConfigPage(string serial)
{
//do printing work
}
我的问题是在线程内部抛出一个异常,但没有得到处理。
我试过用 try catch 包装它
try
{
Task.Factory.StartNew(() => DoPrintConfigPage(serial));
}
catch (Exception ex) { }
但它仍然没有捕获到错误并因此导致应用程序崩溃。
如何在主线程中捕获异常以便处理它们?
更新
我已经做了下面推荐的更改,但它仍然说异常未处理
var task = Task.Factory.StartNew(() => DoPrintConfigPage(serial))
.ContinueWith(tsk =>
{
MessageBox.Show("something broke");
},TaskContinuationOptions.OnlyOnFaulted);
然后在我的 DoConfigPage
中添加了另一个 try catch。
在这个 catch 中,现在它崩溃了,并说抛出的异常没有得到处理,我错过了什么?
private void DoPrintConfigPage(string serial)
{
try
{
//call the print function
}
catch (Exception ex)
{
throw ex; //it is crashing here and saying it is unhandled
}
}
我也尝试了 Eric J. 的建议,结果相同
var task = Task.Factory.StartNew(() => DoPrintConfigPage(serial));
try
{
task.Wait();
}
catch (AggregateException ex) { MessageBox.Show("something broke"); }
最佳答案
或者,您可以链接您的任务创建并添加一个 ContinueWith:
var job = Task.Factory
.StartNew(...)
.ContinueWith(tsk =>
{
// check tsk for exception and handle
});
编辑:这段代码在运行时会为我弹出消息框:
void Main()
{
var serial = "some serial";
var task = Task.Factory
.StartNew(() => DoPrintConfigPage(serial))
.ContinueWith(tsk =>
{
MessageBox.Show("something broke");
var flattened = tsk.Exception.Flatten();
// NOTE: Don't actually handle exceptions this way, m'kay?
flattened.Handle(ex => { MessageBox.Show("Error:" + ex.Message); return true;});
},TaskContinuationOptions.OnlyOnFaulted);
}
public void DoPrintConfigPage(string serial)
{
throw new Exception("BOOM!");
}
关于c# - 使用 Task.Factory 时捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14883850/