C# 检查线程池是否有任何活动线程

C# 检查线程池是否有任何活动线程,c#,threadpool,C#,Threadpool,我正在编写一个响应IMAP推送通知的windows服务。收到通知后,我使用ThreadPool将用户工作项排队。(它调用的方法将一些东西放入数据库等) 在某个时刻,我想停止我的服务,这将停止线程池对其他线程进行排队,并等待直到没有打开的线程在工作 //Pseudo code public void StopService() { while (true) { if (ThreadPool.ActiveThreads == 0) {

我正在编写一个响应IMAP推送通知的windows服务。收到通知后,我使用
ThreadPool
将用户工作项排队。(它调用的方法将一些东西放入数据库等)

在某个时刻,我想停止我的服务,这将停止
线程池
对其他线程进行排队,并等待直到没有打开的线程在工作

//Pseudo code
public void StopService()
{
    while (true)
    {
        if (ThreadPool.ActiveThreads == 0)
        {
            //disconnect imap
            //stop service
        }
    }
}
更好的方法是告诉
ThreadPool
我希望得到通知,它没有活动线程,这样我就不必在while循环中轮询它


使用线程安全计数器,这是确定线程池是否有任何打开的线程的一种方法,但是肯定要在
线程池
类之外有一个标志或某些方法/属性来确定这一点吗?

我建议您将所有单个工作项连接到
手动重置事件
中,然后将所有工作项在
线程池
中排队,然后调用
WaitHandle.WaitAll(myResetEvents)等待所有工作项完成,然后关闭服务,等等

节目流程

  • 启动服务
  • 开始听
  • 将工作项排队
  • 停止侦听新项目
  • 等待所有项目完成-WaitHandle.WaitAll(allMyQueuedWorkitems)
  • 停止服务

  • 您正在运行的代码不是线程池中的活动线程吗?确定为什么不是?我写伪代码是有原因的,它有助于形象化我写的东西。我只是想,这就是为什么你永远不会进入
    if
    语句并停止服务的原因。所以在stop service方法中,我应该做
    while(WaitHandle.WaitAll(…){//stop service//return}
    ?不,您将在某个时刻停止侦听新请求,然后等待所有现有排队项目完成,然后调用close service方法。查看更新程序流程的答案哦,我知道了,我调用stop service方法,在那一点上我停止监听,然后放入
    WaitHandle.WaitAll
    ,然后我的代码实际停止服务。调用
    WaitAll
    似乎在完成之前不会在它之后执行代码。是的,通过调用
    WaitAll()
    ,它将阻止主线程,直到您排队的所有项目都完成。