以下是一些代码:
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;
}
我的代码与上面的代码相似,但当我点击按钮时,整个应用程序崩溃,没有任何异常或任何东西。有人可以帮忙吗?我无法弄清楚我做错了什么.. :)
谢谢你们,祝大家新年快乐。答案 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之前,我只需要给每个函数一些时间。
再次感谢