捕获.NET线程中的异常

时间:2010-03-17 10:24:53

标签: c# .net multithreading

你怎么能找出多线程应用中的Exception中发现Thread?并连续清理资源?

因为否则Thread仍然可以保留在内存中并运行。

5 个答案:

答案 0 :(得分:5)

正如肖恩所说,你必须在线程方法中进行所有异常处理和清理,你不能在Thread初始化中做到这一点。例如:

public void Run()
{
    try
    {
        Thread thread1 = new Thread(ThreadEntry1);
        thread1.Start();

        Thread thread2 = new Thread(ThreadEntry2);
        thread2.Start();
    }
    catch (NotImplementedException)
    {
        // Neither are caught here
        Console.WriteLine("Caught you");
    }
}

private void ThreadEntry1()
{
    throw new NotImplementedException("Oops");
}

private void ThreadEntry2()
{
    throw new NotImplementedException("Oops2");
}

相反,这种方法更加独立,显然也有效:

public void Run()
{
    Thread thread1 = new Thread(ThreadEntry1);
    thread1.Start();
}

private void ThreadEntry1()
{
    try
    {
        throw new NotImplementedException("Oops");
    }
    catch (NotImplementedException)
    {
        Console.WriteLine("Ha! Caught you");
    }
}

如果你想知道线程是否失败,那么你应该考虑一个WaitHandles的数组,并发回给你的调用方法。另一种更简单的方法是在每次线程操作完成时简单地递增一个计数器:

Interlocked.Increment(ref _mycounter);

答案 1 :(得分:2)

如果你担心这种事情,那么你应该将你的线程入口点包装在try / catch块中并明确地进行清理。传递出线程入口点的任何异常都会导致您的应用关闭。

答案 2 :(得分:1)

一个。你有一个调用堆栈,你可以在线程中捕获它并将线程id添加到日志中我猜...

如果以良好的方式包装线程,可以在catch部分添加清除代码,并在需要时终止线程。

答案 3 :(得分:1)

您可以像使用任何普通函数一样捕获线程内的异常。 如果一个线程的“工作”函数被称为DoWork,那么执行以下操作:

private void DoWork(...args...)
{
try
{
// Do my thread work here
}
catch (Exception ex)
{
}
}

答案 4 :(得分:1)

Eric Lippert最近post关于工作线程中发生异常的不良情况。值得阅读和理解异常是“例外”,并且在工作线程中出现异常之后,您唯一可以确定的是您无法再确定应用程序的状态。