我需要清理每个正在运行的线程,以防主线程完成。我在启动后立即在List<Thread>
集合中放置了运行线程。
我的&#34;轮&#34;方法是:
static void CheckThreadIsAliveJob(object thread)
{
while (((Thread)thread).IsAlive)
{
Thread.Sleep(1000);
}
// DO staff
}
我认为我的方法对于大量的线程而言非常昂贵,因为我需要为每个线程启动带有CheckThreadIsAliveJob
主体的新线程。
有什么想法吗?
我重写了上面的代码,但这看起来仍然很合理:
static void RemoveFinishedThreadsJob(object threadList)
{
foreach (var thread in (IList<Thread>)threadList)
{
if (!thread.IsAlive)
lock (threadList)
{
((IList<Thread>) threadList).Remove(thread);
}
}
Thread.Sleep(1000);
}
我在班上实现了IDisposable接口的Dispose方法:
public void Dispose()
{
foreach (var thread in _runningThreads)
{
if (thread.IsAlive)
thread.Abort();
if (_removeFinishedThreads.IsAlive)
_removeFinishedThreads.Abort();
}
}
现在,当应用程序关闭且GC正在收集垃圾时,所有正在运行的线程都会手动中止。
答案 0 :(得分:0)
看起来你只是在循环等待线程退出。如果是这种情况,那么只需使用Thread.Join等待它退出。
此外,永远不要使用Thread.About
因为它可能会使您的程序处于不良状态。而是通过调用Join
与线程通信它应该关闭并等待线程退出。
答案 1 :(得分:0)
如果您只想在终止主线程时完成其他线程,只需设置Thread.IsBackground=true
即可。
它们也会自动终止。