我今天在玩我的一个项目时发现了一个有趣的小片段,给定以下模式,您可以安全地清理一个线程,即使它被迫提前关闭。我的项目是一个网络服务器,它为每个客户端生成一个新线程。我发现这对于从远程端提前终止很有用,但对于本地端也很有用(我可以从我的处理代码中调用 .Abort()
)。
您是否可以看到任何问题,或者您对任何正在研究类似方法的人有什么建议?
测试用例如下:
using System;
using System.Threading;
class Program
{
static Thread t1 = new Thread(thread1);
static Thread t2 = new Thread(thread2);
public static void Main(string[] args)
{
t1.Start();
t2.Start();
t1.Join();
}
public static void thread1() {
try {
// Do our work here, for this test just look busy.
while(true) {
Thread.Sleep(100);
}
} finally {
Console.WriteLine("We're exiting thread1 cleanly.\n");
// Do any cleanup that might be needed here.
}
}
public static void thread2() {
Thread.Sleep(500);
t1.Abort();
}
}
作为引用,如果没有 try/finally block ,线程就会像预期的那样死掉。
最佳答案
除非整个应用程序都崩溃,否则完全中止另一个线程只是一个坏主意。很容易让您的程序处于未知状态。中止您的自己的线程偶尔有用 - 例如,如果您想提前结束响应,ASP.NET 会抛出 ThreadAbortException
- 但这不是一个非常好的设计。
线程的安全清理应该是相互的——应该有一些共享标志请求线程关闭。线程应定期检查该标志并适当退出。
关于C# 线程模式 - 这是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/597590/