为什么BackgroundWorker无限循环停止


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    MsgBox("test")
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    BackgroundWorker1.RunWorkerAsync()
End Sub

一旦我点击Button1,消息框出现。当点击"确定"one_answers"返回"(回车)键时,它会一次又一次地出现…但是当我永久点击返回键时,几乎5秒后程序给我运行时错误。

错误不是英语在我的电脑,我翻译了它。这几乎意味着"BackgroundWorker很忙,不能同时做两个进程……"

我知道那个错误。这是因为试图运行BackgroundWorker,而它正在运行。在代码中,它只是从RunWorkerCompleted事件开始。因此,如果"工作未完成",则无法重新开始。谁在运行BackgroundWorker ?

你需要先阅读这篇文章,它讨论了重新进入的危险以及对话框(如MsgBox)如何解决这个问题。

这就是而不是在程序中所做的。对话框只能与在同一线程上创建的其他窗口形成模态。这个工作线程没有任何属性。所以没有什么可以阻止你从按下Enter键,并且被具有焦点的控件看到。Button1。请注意,您可以简单地使用鼠标选择主窗口并单击按钮。大爆炸。

这不会经常出错,您可以通过倾斜Enter键来帮助它开始重复。它将通常被消息框窗口检测。但并非总是如此,在DoWork结束和重新启动之间有一瞬间。只要让UI线程有机会看到击键即可。现在回车键操作Button1,它再次启动BGW。RunWorkerCompleted事件处理程序也是如此,它不能启动两次。大爆炸。

这不是对话框的唯一问题,你还没有发现其他的失败模式。对话框需要一个所有者窗口,它可以显示在上面。那个消息框确实有一个,它必须回退到桌面窗口。现在要判断哪个窗口在前面。可以是对话框,可以是主窗口。将消息框置于主窗口下方。用户看不到它,不知道有一个。也没有任务栏按钮

长话短说:这行不通。只在UI线程上显示UI。

最新更新