Фоновый рабочий C # winform - PullRequest
6 голосов
/ 02 июля 2010

это плохая идея загрузить все из фонового рабочего ??Текущий код выполняется на Form_load.мы получаем много данных из веб-сервиса.некоторые длительные работы в фоновом режиме.

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

Спасибо.

Ответы [ 7 ]

2 голосов
/ 02 июля 2010

Размер кода не является метрикой, которую вы должны использовать, чтобы определить, выполнять ли работу в отдельном потоке.В худшем случае длина выполнения равна.

Во-первых, существует не так много конструкций пользовательского интерфейса, в которых действительно желательно выполнить кучу работы над Form_Load.Если это возможно, я обычно либо:

  • Инициирую эту работу, прежде чем открывать форму непосредственно в ответ на действие пользователя.
  • Переместить всю работу в фоновый режим и асинхронно обновить(связать?) результаты с формой.
  • Задержка работы до тех пор, пока пользователь не выполнит определенное действие, которое требует его.

Ваши пользователи будут хотеть / ожидать, что ваши формы будут чрезвычайнобыстро и отзывчиво, независимо от того, сколько работы делается.Выполнение потенциально длительных операций во время Form_Load всегда приводит к плохому взаимодействию с пользователем.

BackgroundWorker - это только один механизм для асинхронного выполнения работы, есть много других.Вы должны выбрать тот, который наиболее подходит для каждой ситуации.

1 голос
/ 02 июля 2010

Лично я бы не помещал код в рабочий поток, если бы код, включающий в себя определенный процесс, не мешал отзывчивости пользовательского интерфейса.Нет причин, по которым я могу подумать, что все можно поставить на рабочий поток.Как правило, у вас возникают проблемы с отзывчивостью, когда вы ожидаете внешнего ресурса, такого как веб-служба (если вы не вычисляете простые числа в Form_Load: -).

Если вы не исследовали асинхронные вызовы веб-службы,Рекомендую посмотреть.Асинхронные вызовы будут обрабатывать ваши потоки для вас - всегда хорошо.

1 голос
/ 02 июля 2010

Является ли это хорошей идеей или нет, очень сильно зависит от специфики вашей проблемы.Нужно ли извлекать все данные за один вызов или вы можете делать это отдельными частями?

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

Кроме того, в веб-формах (поскольку вы упоминаете Page_Load) IIRC вы будете делиться пулом потоков с asp.netи, возможно, ваше приложение станет менее отзывчивым в целом при некотором пороге одновременных запросов / пользователей.

1 голос
/ 02 июля 2010

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

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

Это зависит от нескольких факторов:

  • Количество маленьких / больших кусков кода - это повлияет на количество одновременно работающих потоков.
  • Важность отзывчивости и производительности для приложения
  • Важность сопровождения / масштабируемости для приложения.
1 голос
/ 02 июля 2010

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

Если ваш код вызывает веб-службу (или какую-либо внешнюю систему, которая может быть отключена) или выполняет что-то, что, вероятно, займет больше времени, чем несколько секунд, тогда это было бы хорошим кандидатом для включения в фоновый рабочий. Однако, если выполнение чего-либо последовательно занимает менее секунды или около того, я, вероятно, не стал бы беспокоиться.

1 голос
/ 02 июля 2010

BackgroundWorker обычно используется, чтобы сделать пользовательский интерфейс Winforms более отзывчивым.Вы можете использовать его для фоновой обработки в веб-приложении, но я этого не делаю;Я использую ThreadPool в службе Windows.

0 голосов
/ 02 июля 2010

По вашей ссылке на «Page_Load» кажется, что вы реализуете это в веб-форме ASP.NET.Если это так, и вы пытаетесь вызвать веб-сервис асинхронно, то вы должны использовать функции вызова Begin и End сервиса.Это работает особенно хорошо, если вам нужно вызывать несколько веб-сервисов одновременно, а не вызывать их по одному как синоним.

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

...