单个任务由多个背景工作者处理?

时间:2010-06-23 21:51:39

标签: vb.net multithreading backgroundworker

我有一个数组,它是文件夹中的文件列表,我正在处理文件并重命名它们。重命名它们大约需要15分钟,这是每天完成的。我目前有1个Backgroundworker来处理这个并更新UI。

我的问题是:我如何使用超过1个Backgroundworker来使用超过25%的CPU来执行此操作?

将阵列拆分为3个部分并调用3个独立的工作人员来完成他们的工作?

3 个答案:

答案 0 :(得分:3)

如果你使用的是.NET 4.0,那么你可以使用Parallel Extensions来实现这一点 - 你只需要调用

Parallel.ForEach(files, file =>
{
    // Call file processor here
});

请注意,如果您的任务受到大量IO限制,使用多个线程可能会降低速度,而不是加快速度。

答案 1 :(得分:1)

您可以创建一个在构造函数中接受文件夹路径的工作类。此worker类负责重命名初始化文件夹的上下文中的所有文件。该类可以有一个DoWork()方法,您可以在其中进行所有重命名工作。这将允许您为每个文件夹创建1个工作类,然后在单独的线程上启动每个工作类,从而根据需要拆分工作。将线程优先级设置得更高将为您提供更多的CPU时间。

System.Threading命名空间包含您需要的内容。

public class worker
{
   private string _folderPath = string.Empty;

   public worker(string folderPath)
   {
     _folderPath = folderPath
   }

   public void DoWork()
   {
     //work happens here
   }
}


worker fileWorker = new worker("path to file folder");
Thread newThread = new Thread(fileWorker.DoWork);
newThred.Start();

享受!

答案 2 :(得分:0)

如果处理每个项目的时间变化很小,那么拆分数组并给每个工人一个部分可能没问题。但是,您可能会发现将列表集中保存并让每个工作人员说“给我一些工作要做”,这应该确保更均匀地共享工作。它也适用于更多变量的工人,工人可以在系统资源允许的情况下来来往往。