如何在异步操作中维护Try / Catch堆栈

时间:2017-11-14 23:03:42

标签: c# asynchronous try-catch task

我有一个运行许多异步任务的Windows服务,但是我遇到了捕获异常并将它们返回给调用方法的问题。在下面的伪代码示例中,try / catch只是停止整个服务而不是运行堆栈。在异步任务中实现Try / Catch的最佳方法是什么?

foreach (var t in tables)
{
    try
    {
        new Task(async () =>
            {
                try
                {
                    //Do stuff
                }
                catch (DataError e)
                {
                    throw e;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        };
    }
    catch (Exception e)
    {
        return new DatabaseActionResult();
    }
}

最终,无论在任何任务中发生什么,我都想捕获并返回 DatabaseActionResult 对象。但是,一旦 throw e 发生,它就完全关闭了服务,其他任何Try / Catch块都没有捕获任何东西。

如果没有“等待”任务,我怎样才能实现这项工作?

1 个答案:

答案 0 :(得分:-3)

在我看来,async旨在用于等待设计错误捕获。我没有看到你想要做的事情的好方法。

如果你想要更好地控制错误的处理方式而不必等待任务,你可以明确地在一个单独的线程中运行任务,而不是让异步处理它。