我创建了一个处理ThreadManager
的{{1}}类,其任务是添加新的Threads
并清除死亡threads
。但是,创建的threads
仍为活着且处于threads
状态。我检查过身体已成功完成执行。有什么想法吗?
ThreadState.WaitSleepJoin
主线程执行:
public bool TryAddThread(ThreadStart threadBody, ThreadStartInfo startInfo)
{
bool success = false;
// Validate arguments
if (threadBody == null || startInfo == null)
{
return false;
}
if (!Monitor.TryEnter(_lock) || !_allowNewThreads)
{
return false;
}
try
{
Thread newThread = new Thread(threadBody);
StartThread(newThread, null, startInfo);
success = true;
}
finally
{
Monitor.Exit(_lock);
}
return success;
}
private void StartThread(Thread newThread, object threadParams, ThreadStartInfo startInfo)
{
if (newThread == null || startInfo == null)
{
return;
}
// Apply start info
newThread.Name = startInfo.Name;
newThread.SetApartmentState(startInfo.ApartmentState);
newThread.IsBackground = startInfo.IsBackground;
if (threadParams == null)
{
newThread.Start();
}
else
{
newThread.Start(threadParams);
}
_threads.Add(newThread);
RemoveDeadThreads();
}
public void RemoveDeadThreads()
{
_threads.RemoveAll(t => (!t.IsAlive));
}
答案 0 :(得分:2)
当程序的主启动线程终止时,您可以要求CLR自动中止线程。但是 not 是自动的,你必须将线程的IsBackground属性显式设置为true。 Threadpool线程自动打开该属性。
答案 1 :(得分:1)
WaitSleepJoin表示线程已通过调用lock(Monitor.Enter),调用Thread.Sleep或调用Thread.Join或其他一些线程同步对象来阻止自身。
也许如果您提供导致此线程状态的示例线程入口点,则有人可以提供更详细的答案。