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