当.NET线程抛出异常时会发生什么?

Sha*_*lle 18 .net c# multithreading exception-handling exception

我们有一个接口IPoller,我们有各种各样的实现.我们有一个进程将接受一个I​​Poller并在一个单独的线程中启动它.我试图想出一种通用的方法来为任何不自行处理的IPoller提供异常处理.

我最初的想法是创建一个IPoller的实现,它将接受一个I​​Poller并只提供一些日志记录功能.我遇到的问题是如何提供此错误处理?如果我有IPoller.Start()这是Thread的目标,那将发生异常?或者我可以挂钩的线程本身有什么东西?

Rex*_*x M 20

就像是:

Thread thread = new Thread(delegate() {
    try
    {
        MyIPoller.Start();
    }
    catch(ThreadAbortException)
    {
    }
    catch(Exception ex)
    {
        //handle
    }
    finally
    {
    }
});
Run Code Online (Sandbox Code Playgroud)

这将确保异常不会使其成为线程的顶部.


Mar*_*ell 11

您应该在线程顶部使用的方法中捕获异常,并从那里进行日志记录.

未处理的异常(在线程顶部)将(在2.0以后)终止您的进程.不好.

即你传递给Thread.Start(等)的任何方法都应该有一个try/ catch,并在catch(记录,也许是优雅的关闭等)中做一些有用的事情.

为此,您可以使用:

  • 静态日志记录方法
  • 将变量捕获到委托中(作为匿名方法)
  • 在已经知道记录器的实例上公开您的方法


zvo*_*kov 8

在.NET 4.0+中,您应该使用Tasks而不是线程.这是关于任务并行库中异常处理的一篇很好的文章