Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程异常处理_C#_Multithreading_Exception Handling - Fatal编程技术网

C# 多线程异常处理

C# 多线程异常处理,c#,multithreading,exception-handling,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)

下面是一个简单的程序:

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;
            }
        }
    }
}
类程序
{
静态计算=新计算();
静态void Main(字符串[]参数)
{
尝试
{
var t1=新螺纹(计算除法);
t1.Start();
}
捕获(除零例外)
{
//Console.WriteLine(“错误线程:+e.Message”);
}
尝试
{
计算除法();
}
捕获(例外e)
{
//Console.WriteLine(“错误计算:+e.Message”);
}
}
类计算
{
公共int Num1;
公共国际单位m2;
随机=新随机();
公共部门
{
对于(int i=0;i<100000;i++)
{
Num1=随机。下一个(1,10);
Num2=随机。下一个(1,10);
尝试
{
int结果=Num1/Num2;
}
捕获(例外情况除外)
{
掷骰子;
}
Num1=0;
Num2=0;
}
}
}
}
两个线程同时执行相同的方法。其中一个函数将Num1设置为0,而另一个函数试图同时除以Num1(0)。问题是为什么抛出异常,为什么它没有被主方法内的try-catch块捕获


主线程是一个线程,新线程是另一个线程。这两个线程彼此不通信,这意味着它们是完全独立的。如果您想在主线程上捕获异常,有两种方法

  • 使用backgroundworker类,RunWorkerCompleted事件将在主线程上激发,例如,如果异常导致线程中止,exception将告诉您

  • 使用全局捕捉器

  • 在代码之前添加此行

    Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
    


    异常不会从一个线程冒泡到启动它的线程。甚至可能无法保证启动引发异常的线程的原始线程是否仍然存在。此外,请注意,即使捕获到异常,IDE有时(取决于设置)也会在异常发生时停止(在这种情况下,它不会被第一个
    捕获
    捕获)
    始终是。TPL的一个(n重要)特性是捕获并处理调用方的异常。裸线程不能做到这一点。
    void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
    //handle the exception
    }