Проблема с BackGroundWorker - PullRequest
       2

Проблема с BackGroundWorker

1 голос
/ 28 июня 2010

Я использую BackGroundWorker, чтобы избежать зависания пользовательского интерфейса при работе с методом, использующим дескрипторы ожидания , и этот метод используется для рисования на панели в пользовательском интерфейсе и имеет аннулирование панели внутри.

something()
{
  draw()
  panel.invalidate()
  A.waitone(500)

}

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

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Если вы хотите, чтобы фоновый процесс обновил пользовательский интерфейс, вам необходимо использовать метод «Вызвать» элемента управления (это обеспечит выполнение кода в потоке пользовательского интерфейса, а не в фоновом потоке):

something()
{
  panel.Invoke(new Action( () => {this.draw(); panel.Invalidate();} );
  A.waitone(500)
}

или без лямбды

something()
{
  panel.Invoke((MethodInvoker)delegate{ this.draw(); panel.Invalidate();});
  A.waitone(500)
}

РЕДАКТИРОВАТЬ: после просмотра нового комментария к другому ответу - вы можете обернуть каждый элемент управления каждый вызов в вызове 'Invoke' во время вашей потоковой обработки, поэтому вместо вызова самого метода 'draw ()' в вызове, Метод draw () использует Invoke всякий раз, когда ему нужно обновить пользовательский интерфейс.

1 голос
/ 28 июня 2010

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

(из комментариев)

Я пытаюсь сделать что-то шаг за шагом, поэтомунужны ручки ожидания

Если вы хотите рисовать шаг за шагом, с задержкой между каждым шагом, то я был бы склонен использовать System.Windows.Forms.Timer вместо ожидания на ручке ожидания.Установите таймер на нужную частоту, а когда он сработает, нарисуйте немного больше того, что вы рисуете.

...