BackgroundWorker在调用doWork时崩溃应用程序

时间:2011-12-31 15:07:33

标签: c# backgroundworker crash

以下是一些代码:

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 个答案:

答案 0 :(得分:2)

你正在使用Backgroundworker完全错误。

旨在从主线程中卸载工作。你正在这样做,但是你在2 while(status == ...)循环中完全占用主线程。那部分是阻止,可能会崩溃您的应用程序。

阅读backgroundworker并使用Completed和ProgressChanged事件来管理UI。

另请注意已完成中的e.Error属性。

另外,我宁愿使用2个单独的Bgw进行阅读和写作。这种状态的东西过于复杂。

答案 1 :(得分:0)

变量测试是Button_click()的本地变量。您可能希望在类级别声明它。

答案 2 :(得分:0)

只是猜测,在test.reading()您是否正在访问任何UI控件?如果是这样,那就是崩溃问题的根源。

答案 3 :(得分:-1)

我不知道它是否有帮助,但我在DoWork()中启动每个函数之前使用一些Thread.Sleep(100)语句解决了我的问题。似乎执行流程太快,因此while(status == ...)循环总是被评估为false。在检查STATE之前,我只需要给每个函数一些时间。

再次感谢