当doWork调用时,BackgroundWorker使应用程序崩溃

本文关键字:应用程序 崩溃 BackgroundWorker doWork 调用 | 更新日期: 2023-09-27 18:19:06

代码如下:

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;
 }

我的代码类似于上面,但当我点击按钮时,整个应用程序崩溃,没有任何例外或任何东西。有人能帮帮我吗?我不知道我做错了什么。:)

谢谢大家,祝大家新年快乐。

当doWork调用时,BackgroundWorker使应用程序崩溃

你完全错误地使用了Backgroundworker。

用于从主线程卸载工作。你在这样做,但是你把主线程完全束缚在2个while(status == ...)循环中。那部分会阻塞你的应用,可能会使你的应用崩溃。

阅读后台工作者,并使用Completed和ProgressChanged事件来管理UI。

还要注意完成中的e.Error属性。

另外,我宁愿使用两个单独的Bgw的阅读和写作。这个身份问题太复杂了。

变量test是Button_click()的局部变量。您可能希望在类级别上声明它。

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

好吧,我不知道它是否帮助任何人,但我解决了我的问题使用一些线程。sleep(100)语句在DoWork()内启动每个函数之前。似乎执行流程太快了,所以while(status ==…)循环总是被计算为false。我只需要在检查STATE之前给每个函数一些时间来工作。

再次感谢