Каков наилучший способ создания нескольких фоновых рабочих потоков? - PullRequest
0 голосов
/ 05 октября 2011

Я хочу выполнить несколько задач (дисковый ввод-вывод на удаленных общих ресурсах) одновременно.Я не хочу блокировать пользовательский интерфейс.Я думаю, что мне нужно создать пользовательский класс, который делает следующее ...

  • Принимает и ставит в очередь запрос (используя стек)
  • Проверяет пул потоков и если поток являетсяavailable запускает его с запрошенной информацией
  • Когда каждый поток завершает проверку стека на наличие ожидающих запросов ...

Есть ли лучший способ сделать это?

Есть ли уже доступный класс для этого?

Должен ли я использовать пул класса BackgroundWorker или что-то еще?

Должен ли я реализовать класс BackgroundWorker в пользовательском классе, чтобы я могсоздать несколько потоков?

Я хочу создать до 8 потоков для удаления файлов и папок.Мне нужно запросить количество элементов в стеке для обновления пользовательского интерфейса.

В настоящее время у меня есть код, работающий с одним потоком BackgroundWorker для удаления файлов и папок (который удерживает пользовательский интерфейс от блокировки, но требуеттак долго, как правило, я запускаю несколько утилит одновременно).

Спасибо, Ли

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Если вы используете .NET 4, то параллельная библиотека задач выглядит именно так, как вам нужно.Ссылка на MSDN здесь: http://msdn.microsoft.com/en-us/library/dd460717.aspx.

В частности, пример на http://msdn.microsoft.com/en-us/library/dd537608.aspx предлагает заменить

foreach (var item in sourceCollection)
{
    Process(item);
}

на

Parallel.ForEach(sourceCollection, item => Process(item));

Просто остерегайтесь тупиковых ситуаций в вашем коде;в частности, проводите тщательное тестирование, поскольку в глубине сетевого стека Windows иногда могут происходить странные вещи.

0 голосов
/ 05 октября 2011

Вы можете использовать пул BackgroundWorker, но учтите, что он предназначен для использования в простых многопоточных сценариях.Я бы порекомендовал использовать TPL или Threadpool для вашей проблемы, но если ваш код уже работает с одним BackgroundWorker, вы будете намного быстрее, переписав его для 8 вместо использования TPL.

Возможно, это обсуждение поможет вамрешение: BackgroundWorker против BackgroundThread

...