Лучшая практика для нескольких длинных методов с использованием backgroundworker - PullRequest
7 голосов
/ 10 марта 2010

У меня есть форма, которая имеет много длинных методов. Мой квест: что такое лучшая практика? Используйте анонимный метод и только одного фонового работника или создайте экземпляр BackgroundWorker для каждого длинного метода.

Пожалуйста, помогите. Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 марта 2010

В итоге:

Преимущества в одном BackgroundWorker:

  1. Вы управляете порядком выполнения для метода множественного числа. Тем не менее, это также недостаток, потому что если вы используете несколько BackgroundWorkers, вы «предполагаете», что они выполняются параллельно и не должны беспокоиться о порядке;

  2. Меньше накладных расходов на создание и удаление потоков (если возможно, используйте один и тот же экземпляр каждый раз, но это не всегда возможно, в зависимости от того, что запускает процесс. Это невозможно, если вы хотите, чтобы это было сделано одновременно);

  3. Если вы хотите установить связь между потоками, вы можете накапливать пакетную связь и делать это более эффективно. Более того, это может сэкономить вам часть этого общения, если все методы будут запущены в одном потоке.

Преимущества в нескольких BackgroundWorkers:

  1. Вышеупомянутый параллелизм;

  2. Каждый конец процесса может использовать другого делегата и, следовательно, выполнять какую-то другую операцию.

Надеюсь, это поможет!

2 голосов
/ 10 марта 2010

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

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

Помогает ли это?

...