2010-03-22 108 views
7

我有这个应用程序将recurse在给定的目录中的所有文件夹,并寻找PDF。如果找到PDF文件,应用程序将使用ITextSharp对其页面进行计数。我通过使用线程递归扫描所有文件夹来执行此操作,然后如果找到了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); } 
        ); 
      } 
     } 

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

回答

4

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

请确保您通过Interlocked类中的方法进行递增和递减操作,因为这样可以确保以线程安全的方式完成任务。

一旦反降为零你可以将任务是使用ManualResetEvent

如果你有机会到.NET 4,那么你可以使用新的CountdownEvent类做类似的事情完成的标志。

+0

我对此做了类似的逻辑。只有我使用了ThreadPool.GetAvailableThreads。我设置了池应该使用的MaxThreads。因此,在最后一项任务中,我检查了可用线程是否等于我设置的最大值。不幸的是,这失败我将研究该手动重置事件。 – 2010-03-22 09:23:36

+1

@mcxiand:你不能使用ThreadPool计数器,因为其他代码(lib)可以创建线程并且TP正在回收/删除它们。 – 2010-03-22 09:26:59

+0

@亨克霍尔特曼:是吗?从我理解的是,ThreadPool将由QueueUserWorkItem方法排队等待任务。你能否提供更多关于你评论的细节?这将非常感激。 – 2010-03-22 09:47:14

2

1)如何知道所有线程是否完成?

你必须让线程做自己入住/退房,由括号之间代码:

Interlocked.Increment(ref jobCounter); 
// your code 
Interlocked.Decrement(ref jobCounter); 

如果这打乱了您的匿名委托太多就用包装方法。您可能也必须添加异常处理。

互锁方法仍然等待它成为0的问题,与Sleep()的循环是一个弱,但在这种情况下可行的解决方案。

2)您正在递归树Walker中开始线程。要小心,你可能会创造太多它会损害性能。

+0

我只有一个线程做线程 – 2010-03-22 09:18:27

+0

在每个文件夹中找到每个pdf文件的递归和排队确定,它是更线性的。从扼杀MaxThreads的评论。仍然需要调整和改变MaxThreads是一把大锤。 – 2010-03-22 10:19:41

+0

我控制MaxThreads,因为在这个线程上,我使用BeginInvoke更新UI控件。如果有很多线程在运行,UI将冻结。任何建议? – 2010-03-22 10:50:01

相关问题