线程在执行后保持活跃状态

时间:2012-07-30 15:11:14

标签: c# execution termination thread-state

我创建了一个处理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));
    }

2 个答案:

答案 0 :(得分:2)

当程序的主启动线程终止时,您可以要求CLR自动中止线程。但是 not 是自动的,你必须将线程的IsBackground属性显式设置为true。 Threadpool线程自动打开该属性。

答案 1 :(得分:1)

WaitSleepJoin表示线程已通过调用lock(Monitor.Enter),调用Thread.Sleep或调用Thread.Join或其他一些线程同步对象来阻止自身。

也许如果您提供导致此线程状态的示例线程入口点,则有人可以提供更详细的答案。