Обработка нескольких операций с использованием BackgroundWorker - PullRequest
2 голосов
/ 10 июня 2011

У меня есть DataGridView на winform. Я динамически добавляю DatagridViewButtonColumn в метод загрузки формы с именем кнопки как btnAction и текстом, отображаемым на нем как «Процесс».

Итак, каждая строка в сетке будет иметь эту кнопку «Процесс» в последнем столбце.

При событии нажатия этой кнопки я использую BackgroundWorker для вызова метода, который выполняет некоторые вычисления. После завершения вычислений мне нужно обновить текст этой нажатой кнопки как «Обработано» в этой строке сетки. Теперь, как мне справиться с этим сценарием? -> Пользователь нажимает на несколько кнопок «Процесс», и мне нужно запустить вычисления для всех соответствующих строк в сетке. Может ли это быть выполнено с помощью BackgroundWorker или мне нужно использовать многопоточность здесь?

Пожалуйста, помогите с фрагментом кода, если это возможно.

Ответы [ 3 ]

2 голосов
/ 10 июня 2011

Короткий ответ: тот же BackgroundWorker не может быть вызван снова, когда он работает. Если вы сделаете это, вы получите ошибку:

Это BackgroundWorker в настоящее время занят и не может запустить несколько задач одновременно.

Эта проблема обсуждалась здесь в StackOverflow: Этот BackgroundWorker в настоящее время занят и не может запускать несколько задач одновременно

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

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

0 голосов
/ 10 июня 2011

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.runworkercompleted(v=vs.85).aspx

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

0 голосов
/ 10 июня 2011

У меня был похожий сценарий при использовании процесса BackgroundWorker.

Следующая статья Codeproject мне очень помогла обойти это.

http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads.aspx

...