Одиночная задача, обработанная несколькими специалистами по фону? - PullRequest
2 голосов
/ 24 июня 2010

У меня есть массив, который представляет собой список файлов в папке, я обрабатываю файлы и переименовываю их.Чтобы переименовать их все, требуется около 15 минут, это делается ежедневно.В настоящее время у меня есть 1 Backgroundworker, чтобы справиться с этим и обновить пользовательский интерфейс.

У меня такой вопрос: как я могу использовать более одного Backgroundworker, чтобы использовать для этого более 25% ЦП?

Разбить массив на 3 части и вызвать 3 отдельных работников для выполнения своей части?

Ответы [ 3 ]

3 голосов
/ 24 июня 2010

Если вы используете .NET 4.0, то вы можете использовать Parallel Extensions, которые эффективно сделают это для вас - вы просто позвоните

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

Обратите внимание, что если ваша задача сильно связана с IO,несколько потоков могут замедлить его вместо ускорения.

1 голос
/ 24 июня 2010

Вы можете создать рабочий класс, который принимает путь к папке в конструкторе. Этот рабочий класс отвечает за переименование всех файлов в контексте папки, с которой он инициализирован. Класс может иметь метод DoWork (), в котором будет выполняться вся ваша работа по переименованию. Это позволит вам создать 1 рабочий класс в каждой папке, а затем запустить каждый рабочий класс в отдельном потоке, тем самым разделив работу так, как вам бы хотелось. Установка более высокого приоритета потока даст вам больше времени на процессоре.

Пространство имен 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();

Наслаждайтесь!

0 голосов
/ 24 июня 2010

Если есть небольшая изменчивость во времени для обработки каждого элемента, тогда разделение массива и предоставление каждому рабочему части может быть в порядке. Тем не менее, вам может показаться, что лучше вести список централизованно и попросить каждого работника сказать «дайте мне немного работы», это должно обеспечить более равномерное распределение работы. Кроме того, оно устойчиво к изменчивой популяции работников, и рабочие могут приходить и уходить, если позволяют системные ресурсы.

...