捕获.NET线程中的异常

PaN*_*1Me 7 .net c# multithreading

你怎么能找到,一个Exception在发生Thread多线程应用程序?并连续清理资源?

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

Chr*_*s S 5

正如Sean所说,你必须在线程方法中进行所有异常处理和清理,你不能在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");
}
Run Code Online (Sandbox Code Playgroud)

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

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Interlocked.Increment(ref _mycounter);
Run Code Online (Sandbox Code Playgroud)