当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;
}
我的代码类似于上面,但当我点击按钮时,整个应用程序崩溃,没有任何例外或任何东西。有人能帮帮我吗?我不知道我做错了什么。:)
谢谢大家,祝大家新年快乐。
你完全错误地使用了Backgroundworker。
用于从主线程卸载工作。你在这样做,但是你把主线程完全束缚在2个while(status == ...)
循环中。那部分会阻塞你的应用,可能会使你的应用崩溃。
阅读后台工作者,并使用Completed和ProgressChanged事件来管理UI。
还要注意完成中的e.Error
属性。
另外,我宁愿使用两个单独的Bgw的阅读和写作。这个身份问题太复杂了。
变量test是Button_click()的局部变量。您可能希望在类级别上声明它。
只是一个猜测,在test.reading()
你访问任何UI控件?如果是这样,那就是你的崩溃问题的根源。
好吧,我不知道它是否帮助任何人,但我解决了我的问题使用一些线程。sleep(100)语句在DoWork()内启动每个函数之前。似乎执行流程太快了,所以while(status ==…)循环总是被计算为false。我只需要在检查STATE之前给每个函数一些时间来工作。
再次感谢