我正在开发我的第一个 Windows 服务项目,该项目涉及一些基本的线程/并行性。到目前为止它非常激烈,但我正在慢慢开始理解线程(我想我们会看到......)。
我有一个 Windows 服务,它将包含 2 个松散耦合的工作线程。线程 A 将从 FTP 服务器下载文件,解压缩/准备它们并保存到线程 B 将有 FileSystemWatcher 监视的另一个目录。线程 B 将解析文件,对数据做一些事情,进行一些 http 调用,最后归档并从工作目录中删除文件。
我才刚刚开始工作,我现在面临的问题是如何等待线程A和线程B都返回。我看了这个问题: Thread.Join on multiple threads with timeout并有了一个想法。
问题是,如果我们正在等待 x 个线程以每个线程的 x 秒超时返回,那么即使在正常操作下,如果有足够多的线程,服务也可能会出现无响应(我在 SCM 抱怨之前读到超时是 30 秒,对吗?)。此外,如果我们通过在循环线程时跟踪加入的剩余时间来解决这个问题,我们在工作线程集合开始时等待线程的时间越长,剩余线程返回的时间就越少 - 所以最终如果有足够的线程,即使所有线程都在预期的时间内返回,服务也会显得无响应。
在这种情况下,我可能会在 14 秒超时后将 A 和 B 都加入线程,因为我只有两个工人,而 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));
});
}