我正在编写一个响应IMAP推送通知的Windows服务。收到通知后,我使用 ThreadPool
对用户工作项进行排队。(它调用的方法将一些东西放在数据库中等等)。
在某些时候,我想停止我的服务,这将阻止ThreadPool
排队其他线程并等待,直到没有正在工作的打开线程。
//Pseudo code
public void StopService()
{
while (true)
{
if (ThreadPool.ActiveThreads == 0)
{
//disconnect imap
//stop service
}
}
}
更好的方法是告诉ThreadPool
我希望收到通知它没有活动线程,这样我就不必在 while 循环中轮询它。
这个问题使用线程安全计数器,这是确定 ThreadPool 是否有任何打开线程的一种方法,但肯定必须有一个标志或 ThreadPool
类之外的某个方法/属性来确定这一点?
我建议您将所有单独的工作项挂接到ManualResetEvent
然后将ThreadPool
中的所有工作项排队,然后调用WaitHandle.WaitAll(myResetEvents);
等待所有工作项完成,然后关闭服务,依此类推。
程序流程
- 启动服务
- 开始聆听
- 排队工作项
- 停止侦听新项目
- 等待所有项目完成 -WaitHandle.WaitAll(allMyQueuedWorkitems)
- 停止服务