c# - 如何知道所有线程池的线程是否已经完成了它的任务?

标签 c# .net multithreading threadpool

我有这个应用程序,它将递归给定目录中的所有文件夹并查找 PDF。如果找到 PDF 文件,应用程序将使用 ITextSharp 计算其页数。我通过使用一个线程递归扫描所有文件夹中的 pdf 来做到这一点,然后如果找到 PDF,这将排队到线程池。代码如下所示:

//spawn a thread to handle the processing of pdf on each folder.
                var th = new Thread(() =>
                {
                    pdfDirectories = Directory.GetDirectories(pdfPath);
                    processDir(pdfDirectories);
                });
                th.Start();



 private void processDir(string[] dirs)
        {
            foreach (var dir in dirs)
            {
                pdfFiles = Directory.GetFiles(dir, "*.pdf");
                processFiles(pdfFiles);

                string[] newdir = Directory.GetDirectories(dir);
                processDir(newdir);
            }
        }



private void processFiles(string[] files)
        {
            foreach (var pdf in files)
            {
                ThreadPoolHelper.QueueUserWorkItem(
                    new { path = pdf },
                    (data) => { processPDF(data.path); }
                    );
            }
        }

我的问题是,我怎么知道线程池的线程已完成处理所有排队的项目,以便我可以告诉用户应用程序已完成其预期任务?

最佳答案

通常我会通过一个计数器变量来做这样的事情。
对于您在 ThreadPool 中排队的每个工作项给计数器变量加一。
然后当它被处理时,你会减少计数器变量。

确保您通过 Interlocked 上的方法进行递增和递减。类,因为这将确保事情以线程安全的方式完成。

一旦计数器归零,您可以使用 ManualResetEvent 标记任务已完成。

如果您可以访问 .NET 4,那么您可以使用新的 CountdownEvent 类做类似的事情。

关于c# - 如何知道所有线程池的线程是否已经完成了它的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2490702/

相关文章:

multithreading - Delphi 线程与 TRestRequest

java - 在java中使用对象作为互斥体

c# - 如果我在写入变量时锁定,如果读取是原子的,我是否也需要在读取时锁定?

c# - 创建用于监视正在运行的 Windows 服务并与之交互的用户界面

c# - 字符之一匹配的断行

c# - 如何在不使用宏的情况下使 C# 结构与 x86 和 x64 兼容?

javascript - 使用 jquery 或 javascript 将表单值插入到 SQL 查询中

c# - MediaCapture StartPreviewAsync 失败

c# - 如何使 PictureBox 可滚动

c# - VS2010 构建脚本将 DLL 打包到 MSI 中并在 GAC 中注册