mar*_*ela 7 .net c# 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); }
);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我怎么知道线程池的线程已经完成处理所有排队的项目,所以我可以告诉用户应用程序完成了它的预期任务?
一般来说,我会通过使用计数器变量来做类似的事情。对于您排队的每个工作项目,将其ThreadPool添加到计数器变量中。然后,当它被处理时,您将减少计数器变量。
确保通过Interlocked类上的方法进行递增和递减,因为这将确保事情以线程安全的方式完成。
一旦计数器达到零,您可以使用以下命令标记任务已完成ManualResetEvent
如果您可以访问 .NET 4,那么您可以使用新CountdownEvent类来执行类似的操作。
| 归档时间: |
|
| 查看次数: |
5855 次 |
| 最近记录: |