BackgroundWorker Сбой приложения при вызове doWork - PullRequest
0 голосов
/ 31 декабря 2011

Вот код:

class myclass
{
  enum STAT
  {
    IDLE=0;
    READING,
    WRITING,
    PAINTING,
    SKATTING
  }

  public STAT status = STAT.IDLE;
}

void reading()
{//code}

void writting()
{}
...
//Rest function bodies form accordingly

Button_click()
{
  myclass test = new myclass();

  status = STAT.READING
  bgWorker.RunWorkerAsync();

  while(status == STAT.READING)
  {
     label.text = "READING";
     progressbar.value++;
  }

  status = STAT.WRITTING;
  bgWorker.RunWorkerAsync();

  while(status == STAT.WRITTING)
  {
     label.text = "READING";
     progressbar.value++;
  }
 ..........
}

 bgWorker_doWork()
 {
   switch(status)
   {
     case STAT.READING:  test.reading; break;
     ......
   }

   status = STAT.IDLE;
 }

Мой код похож на приведенный выше, но когда я нажимаю кнопку, происходит сбой всего приложения без каких-либо исключений или чего-либо еще. Может кто-нибудь, пожалуйста, помогите? я не могу понять, что я делаю неправильно ..:)

спасибо и с новым годом всех.

Ответы [ 4 ]

2 голосов
/ 31 декабря 2011

Вы используете Backgroundworker совершенно неправильно.

Предназначен для разгрузки работы из основного потока. Вы делаете это, но затем полностью связываете основной поток в петлях 2 while(status == ...). Эта часть блокирует и может привести к сбою вашего приложения.

Прочтите backgroundworker и используйте события Completed и ProgressChanged для управления пользовательским интерфейсом.

Также обратите внимание на свойство e.Error в поле Завершено.

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

0 голосов
/ 15 января 2012

Ну, я не знаю, поможет ли это кому-нибудь, но я решил свою проблему с помощью некоторых операторов Thread.Sleep (100) перед запуском каждой функции внутри DoWork (). Кажется, что поток выполнения был слишком быстрым, поэтому циклы while (status == ...) всегда оцениваются как false. Мне просто нужно было дать каждой функции поработать перед проверкой состояния.

Еще раз спасибо

0 голосов
/ 31 декабря 2011

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

0 голосов
/ 31 декабря 2011

Переменная test является локальной для Button_click ().Возможно, вы захотите объявить это на уровне класса.

...