多线程异常处理

时间:2014-02-21 15:34:48

标签: c# multithreading exception-handling

这是一个简单的程序:

class Program
{
    static Calc calc = new Calc();

    static void Main(string[] args)
    {
        try
        {
            var t1 = new Thread(calc.Divide);
            t1.Start();
        }
        catch (DivideByZeroException e)
        {
            //Console.WriteLine("Error thread: " + e.Message);
        }

        try
        {
            calc.Divide();
        }
        catch (Exception e)
        {
            //Console.WriteLine("Error calc: " + e.Message);
        }

    }

    class Calc
    {
        public int Num1;
        public int Num2;

        Random random = new Random();

        public void Divide()
        {
            for (int i = 0; i < 100000; i++)
            {
                Num1 = random.Next(1, 10);
                Num2 = random.Next(1, 10);

                try
                {
                    int result = Num1 / Num2;
                }
                catch (Exception ex)
                {
                    throw ex;
                }

                Num1 = 0;
                Num2 = 0;
            }
        }
    }
}

两个线程同时执行相同的方法。其中一个将Num1设置为0,而另一个尝试将Num1(0)同时除。问题是为什么抛出异常,为什么它没有被Main方法中的try catch块捕获?

enter image description here

1 个答案:

答案 0 :(得分:0)

主线程是一个线程,你的新线程是另一个线程。这两个线程不相互通信意味着它们完全独立。如果你想在主线程上捕获异常,有两种方法可以做到这一点

  1. 使用backgroundworker类,RunWorkerCompleted事件将在主线程上触发,e.exception将告诉您是否有异常导致线程被中止。

  2. 使用全局捕手

  3. 在代码

    之前添加此行
    Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
    

    void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
    //handle the exception
    }