如何使线程不崩溃的应用程序

问题描述 投票:0回答:5

假设我有以下的控制台程序,是否可以让整个程序不因为后台的异常而崩溃?

Thread thread = new Thread(new ThreadStart(() => { throw new Exception(); }));
thread.IsBackground = true;
thread.Start();

while (true)
  Console.WriteLine("Hello from main thread");

能否让整个程序不会因为后台异常而崩溃(当然不用try...catch)?

c# multithreading
5个回答
6
投票

附加你的未处理异常处理程序。http:/msdn.microsoft.comen-uslibrarysystem.appdomain.unhandledexception.aspx。

更好的方法是用全局处理程序来达到预期的结果(好吧,用trycatch,但只有一次)。

    public static void GlobalHandler(ThreadStart threadStartTarget)
    {
        try
        {
            threadStartTarget.Invoke();
        }
        catch (Exception ex)
        {
             //handle exception here
        }
    }

然后启动你的线程:

        Thread thread = new Thread(o => GlobalHandler(ThreadMethod));
        thread.Start();

P.S. 然而,我真的不喜欢捕捉所有异常的想法。它是 几乎 从来都不是好主意。


0
投票

你可以用一个 ThreadPool 线程。


0
投票

隐藏未处理的异常并忘记它不是好的做法,所以不要这样做。

我不知道为什么你不想使用trycatch,但这是处理这种情况的最好方法,在这种情况下,如果可以的话,你应该修复异常,或者至少将其记录下来,以备以后查看。


0
投票

即使你能 捕捉 全局未处理的异常,你应该知道,有些异常你可能能够捕捉到,但不能捕捉到。处理. StackoverflowException可能没有留下足够的堆栈空间来处理这个异常。OutOfMemory也一样。可能没有足够的空间来处理一个大的对象,但也有可能根本就没有空间了,所以你通常会写代码来捕获和处理那些你可以处理的异常(filenotfound)。所以你通常会写代码来捕获和处理那些你可以处理的异常(filenotfound,accessviolation等),而让所有其他的异常来让你的应用程序崩溃(崩溃总比继续处于未定义状态要好)。对于未处理的异常,你唯一能做的事情就是。尝试优雅地关闭你的应用程序(保存一些更改,写一个错误日志或其他),然后重新抛出异常。

© www.soinside.com 2019 - 2024. All rights reserved.