c# - 使用 Task.Factory 时捕获错误

标签 c# .net multithreading

我正在使用以下内容

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/

相关文章:

c# - 为什么 Math.Round() 不支持 float ?

c# - 引用类型——我们能看到实际的引用吗?

c# - 从 MongoDB 数组中删除元素

java - Java 内存模型是否允许对许多原子/ volatile 变量的非同步访问进行重新排序?

c# - 字节分配不一致

c# - 通过 C# 服务引用使用 Java Web 服务

c# - Linq-OrderByDescending 对我不起作用-ASP.net MVC

c# - 如果我不需要支持特定于语言环境的变体,我可以仅使用 zh-Hans/zh-Hant resx 文件来表示中文吗?

.net - 使用 WCF 创建 Web API

c# - 在不同线程中处理列表项