在多线程应用程序中,如何发现Thread
中发生了Exception
并清理资源?否则,该线程可能仍然保留在内存中运行。
请注意,保留的HTML标签。
在多线程应用程序中,如何发现Thread
中发生了Exception
并清理资源?否则,该线程可能仍然保留在内存中运行。
请注意,保留的HTML标签。
正如Sean所说,你必须在线程方法内完成所有异常处理和清理工作,不能在线程初始化中完成。例如:
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");
}
}
Interlocked.Increment(ref _mycounter);
你可以像处理普通函数一样捕获线程中的异常。 如果你的线程的“工作”函数被称为DoWork,那么可以这样做:
private void DoWork(...args...)
{
try
{
// Do my thread work here
}
catch (Exception ex)
{
}
}
A. 你有一个调用栈,可以在线程内部捕获它并将线程 ID 添加到日志中。
如果你以良好的方式包装线程,可以在 catch 部分添加清理代码,必要时终止线程。