为什么 BackgroundWorker 无限循环停止?
Why BackgroundWorker infinite loop stops?
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 后,消息框 appears.When 使用 "Return"(输入)键单击确定,它一次又一次地出现...但是当我永久单击 Return 键时,几乎5 秒后程序给我 运行 时间错误。
错误不是我电脑里的英文,我翻译了it.It几乎是意思"BackgroundWorker is busy,can't do two procces in the same time..."
我知道 error.It 是因为尝试 运行 BackgroundWorker 而它是 running.In 刚从 RunWorkerCompleted 开始的代码 event.So 它无法再次启动如果 "Work is not Completed"。BackgroundWorker 运行 是谁?
您需要阅读 this post first,它讨论了重入的危险以及对话框(如 MsgBox)如何解决该问题。
它在您的程序中不是。对话框只能针对在同一线程上创建的其他 windows 模态。那个工作线程没有。因此,没有什么可以阻止具有焦点的控件看到您从 also 按下 Enter 键。按钮 1。请注意如何简单地使用鼠标 select 您的主要 window 并单击按钮。轰隆隆。
按原样出错的次数还不够多,您可以通过按回车键使其开始重复来提供帮助。它会通常 被消息框window 检测到。但并非总是如此,在 DoWork 结束和重新开始之间只有一瞬间。足以让 UI 线程有机会看到击键。现在 Enter 按键操作 Button1 并再次启动 BGW 备份。 RunWorkerCompleted 事件处理程序也是如此,它不能启动两次。轰隆隆。
这不是该对话框的唯一问题,您还没有发现其他故障模式。对话框需要一个所有者 window,它可以显示在其上。那个消息框确实有一个,它必须回退到桌面 window。现在是废话,window 将排在前面。可能是对话,可能是你的主要 window。消息框 在主 下方 window。用户看不到它,不知道有一个。也没有任务栏按钮。
长话短说:这行不通。仅在 UI 线程上显示 UI。仅使用工作线程执行非 UI 相关工作。
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 后,消息框 appears.When 使用 "Return"(输入)键单击确定,它一次又一次地出现...但是当我永久单击 Return 键时,几乎5 秒后程序给我 运行 时间错误。
错误不是我电脑里的英文,我翻译了it.It几乎是意思"BackgroundWorker is busy,can't do two procces in the same time..."
我知道 error.It 是因为尝试 运行 BackgroundWorker 而它是 running.In 刚从 RunWorkerCompleted 开始的代码 event.So 它无法再次启动如果 "Work is not Completed"。BackgroundWorker 运行 是谁?
您需要阅读 this post first,它讨论了重入的危险以及对话框(如 MsgBox)如何解决该问题。
它在您的程序中不是。对话框只能针对在同一线程上创建的其他 windows 模态。那个工作线程没有。因此,没有什么可以阻止具有焦点的控件看到您从 also 按下 Enter 键。按钮 1。请注意如何简单地使用鼠标 select 您的主要 window 并单击按钮。轰隆隆。
按原样出错的次数还不够多,您可以通过按回车键使其开始重复来提供帮助。它会通常 被消息框window 检测到。但并非总是如此,在 DoWork 结束和重新开始之间只有一瞬间。足以让 UI 线程有机会看到击键。现在 Enter 按键操作 Button1 并再次启动 BGW 备份。 RunWorkerCompleted 事件处理程序也是如此,它不能启动两次。轰隆隆。
这不是该对话框的唯一问题,您还没有发现其他故障模式。对话框需要一个所有者 window,它可以显示在其上。那个消息框确实有一个,它必须回退到桌面 window。现在是废话,window 将排在前面。可能是对话,可能是你的主要 window。消息框 在主 下方 window。用户看不到它,不知道有一个。也没有任务栏按钮。
长话短说:这行不通。仅在 UI 线程上显示 UI。仅使用工作线程执行非 UI 相关工作。