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