2010-02-12 4 views
2

Мне нужно выполнить 3 операции async параллельно в службе Windows NT (используя .Net2.0/C#). Для этого я использую компонент Backgroundworker.BackgroundWorker Thread - C#

  1. Это хороший вариант/подход?
  2. Для непрерывной работы я снова вызываю RunWorkerAsync() в событии RunWorkerCompleted.

Просьба предложить мне.

ответ

1

Обычно BackgroundWorker используется для длительных операций. Если вам просто нужно выполнить 3 задачи параллельно, вы можете использовать простые потоки.

+0

Все три операции также являются длительными операциями. Привлекает много обработки. Один из них копирует большие файлы MB в папку. Итак, следует ли мне прибегать к нормальным потокам. Я не очень ясен и уверен. – DotNetGuy

+0

Если вам не нужны оповещения о достигнутом прогрессе и завершена задача, вы можете использовать потоки в противном случае, используя фоновый рабочий. – sashaeve

1

Обычно BackgroundWorker используется, когда требуется выполнить RunWorkerCompleted для выполнения обновлений в графическом интерфейсе. По крайней мере, так я его и использовал. Похоже, вы хотите, чтобы это продолжалось постоянно, поэтому почему бы не использовать обычный рабочий поток?

Самая большая проблема, которую я вижу, заключается в том, что BackgroundWorker использует пул потоков .NET. Поэтому, если вы действительно хотите, чтобы это выполнялось непрерывно, вы просто гарантировали использование одного из потоков потока потока, из которых есть ограниченный номер доступен.

+0

Неправильно ли использовать потоки пула потоков ..? – DotNetGuy

+0

Я думаю, это зависит. Я использую их все время прямо сейчас и даже не использовал обычные потоки. Но вам нужно знать ограничение на потоки пулов потоков. BackgroundWorker, Windows Workflow, и я думаю, что просто использование BeginInvoke для делегатов использует пул потоков. Готов поспорить, это довольно легко закончиться в сложном приложении. – Dave

+0

Прохладный! В будущем, если мне нужно обновить какой-то пользовательский интерфейс для отображения прогресса любой из трех операций, тогда вам пригодится BckgrndWrkr. И вы предвидите какие-либо проблемы при вызове RunWorkerAsync() снова в событии RunWorkerCompleted? – DotNetGuy

0

Я бы не использовал фоновых работников для работы, которую вы описываете здесь.

Фоновый работник предназначен для использования в некоторых длинных операциях при сохранении пользовательского интерфейса. Использование служб нарушает шаблон пользовательского интерфейса.

Для обслуживания я бы использовал таймер и три потока.

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

Смежные вопросы