我正在处理我的第一个涉及一些基本线程/并行性的Windows服务项目。到目前为止它一直非常强烈,但我慢慢开始理解线程(我想我们会看到这个...)。等待线程在Windows服务中停止
我有一个Windows服务将包含2松散耦合的工作线程。线程A将从FTP服务器上下载文件,解压/准备它们并保存到另一个目录,其中线程B将有一个FileSystemWatcher监视。线程B将解析这些文件,对这些数据做许多事情,进行一些http调用,最后归档并从工作目录中删除这些文件。
我刚开始工作,现在我面临的问题是如何等待线程A和线程B返回。我看着这个问题:Thread.Join on multiple threads with timeout并有一个想法。
问题是,如果我们等待x线程返回ax每秒的第二个超时,并且有足够的线程,即使在正常操作下服务也可能显示为不响应(我在SCM抱怨之前读取超时为30秒,对?)。另外,如果我们通过跟踪剩余时间来解决这个问题,就像我们在线程上循环一样,我们在工作集合开始处等待线程的时间越长,剩余线程返回的时间就越短 - 最终如果线程足够多,即使所有线程都在预期的时间内返回,服务仍将显示为无响应。
在这种情况下,我可能只是在14秒的时间内在A和B上加入thread.join,因为我只有两个工人,14秒似乎有足够的时间返回两个工人。
如果我有可变数量的工作线程(假设大于8)是否值得做这样的事情?这会工作可靠吗?
注意:不要使用以下内容 - 这是多层次上的一个坏主意。见答案
protected override void OnStop()
{
// the service is stopping - set the event
Worker.ThreadStopEvent.Set();
// stop the threads
Parallel.ForEach(_workerThreads, t =>
{
t.Join(new TimeSpan(0, 0, 28));
});
}
+1你的答案是最多方面的,并且是首先提到CountdownEvent,这似乎是要走的路。 – HAL9000 2011-04-05 22:34:31