Vb.net 为什么BackgroundWorker无限循环停止?

Vb.net 为什么BackgroundWorker无限循环停止?,vb.net,loops,backgroundworker,Vb.net,Loops,Backgroundworker,一旦我点击按钮1,消息框就会出现。当用“回车”(enter)键点击OK时,消息框会一次又一次地出现……但是当我永久性地点击回车键时,几乎5秒钟后,程序会显示运行时错误 这个错误在我的电脑里不是英语,我翻译了它。它几乎意味着“后台工作人员很忙,不能同时完成两个过程…” 我知道这个错误。这是因为试图在BackgroundWorker运行时运行它。在代码中,它只是以RunWorkerCompleted事件开始。因此,如果“工作未完成”,它就不能再次启动。谁运行BackgroundWorker?您需要阅

一旦我点击按钮1,消息框就会出现。当用“回车”(enter)键点击OK时,消息框会一次又一次地出现……但是当我永久性地点击回车键时,几乎5秒钟后,程序会显示运行时错误

这个错误在我的电脑里不是英语,我翻译了它。它几乎意味着“后台工作人员很忙,不能同时完成两个过程…”

我知道这个错误。这是因为试图在BackgroundWorker运行时运行它。在代码中,它只是以RunWorkerCompleted事件开始。因此,如果“工作未完成”,它就不能再次启动。谁运行BackgroundWorker?

您需要阅读,它讨论了重新进入的危险以及对话框(如MsgBox)如何解决问题

这就是它在您的程序中所做的而不是。对话框只能是针对在同一线程上创建的其他窗口的模式对话框。该工作线程没有任何。因此,没有任何东西可以阻止具有焦点的控件看到您的Enter键。按钮1。请注意,您可以简单地使用鼠标选择主窗口并单击按钮。卡布姆

这并不是经常出错,您可以通过按Enter键帮助它开始重复。它通常会被消息框窗口检测到。但并非总是,在嫁妆结束和它重新开始之间有一瞬间。这足以让UI线程有机会看到击键。现在,回车键操作按钮1并再次启动BGW。RunWorkerCompleted事件处理程序也是如此,它不能启动两次。卡布姆

这不是该对话框的唯一问题,您还没有发现其他故障模式。对话框需要一个所有者窗口,一个可以显示在其顶部的窗口。该消息框确实有一个,它必须回退到桌面窗口。现在该看哪扇窗户在前面了。可以是对话框,可以是您的主窗口。在主窗口下方显示消息框。用户看不到它,不知道有一个。也没有任务栏按钮

长话短说:这是行不通的。仅在UI线程上显示UI。仅使用辅助线程来执行与UI无关的工作。

您需要阅读,它讨论了重新进入的危险以及对话框(如MsgBox)如何解决问题

这就是它在您的程序中所做的而不是。对话框只能是针对在同一线程上创建的其他窗口的模式对话框。该工作线程没有任何。因此,没有任何东西可以阻止具有焦点的控件看到您的Enter键。按钮1。请注意,您可以简单地使用鼠标选择主窗口并单击按钮。卡布姆

这并不是经常出错,您可以通过按Enter键帮助它开始重复。它通常会被消息框窗口检测到。但并非总是,在嫁妆结束和它重新开始之间有一瞬间。这足以让UI线程有机会看到击键。现在,回车键操作按钮1并再次启动BGW。RunWorkerCompleted事件处理程序也是如此,它不能启动两次。卡布姆

这不是该对话框的唯一问题,您还没有发现其他故障模式。对话框需要一个所有者窗口,一个可以显示在其顶部的窗口。该消息框确实有一个,它必须回退到桌面窗口。现在该看哪扇窗户在前面了。可以是对话框,可以是您的主窗口。在主窗口下方显示消息框。用户看不到它,不知道有一个。也没有任务栏按钮


长话短说:这是行不通的。仅在UI线程上显示UI。仅使用工作线程来执行与UI无关的工作。

您直接从
后台工作人员在UI中显示内容似乎有点奇怪
-这可能是一个-您的实际最终目标是什么?我不确定是否有人“永久按下返回键”。按住该键最终将发送click to Button1,而不是您期望的MsgBox(在MsgBox按钮显示之前,您不能按它!)。当这种情况发生时,由于代码一直试图保持worker运行,您最终将尝试启动第二个实例,这就是消息所说的。使用
Backgroundworker.IsBusy
查看它是否已经在那里运行。用户交互不是worker的功能。您是希望程序继续运行后台worker,还是说这是一个问题,因为它一直在运行?换句话说,你为什么要按下“返回”键?你是想让消息消失,还是只是想快速点击它?“当用“回车”(enter)键点击OK时,它会一次又一次出现”,这就是你想要发生的吗?例如,我将编写一个Ftp聊天程序。使用backgroundworker,我在Ftp中读取txt文件中的数据,完成后,它必须重复那个代码。所以用户可以在线并尽快获取数据。这个错误让我非常困惑…如果它在bw获取数据时出现?我必须知道这个错误并找到一些解决方案。顺便说一句,聊天程序就是一个“例子”。你直接从一个
BackgroundWorker
在UI中显示东西似乎有点奇怪-这可能是一个-你的实际最终目标是什么?我不确定怎么会有人“永久地按回车键”。按住该键最终将发送click to Button1,而不是您期望的MsgBox(在MsgBox按钮显示之前,您不能按它!)。当这种情况发生时,由于代码一直试图保持worker运行,您最终将尝试启动第二个实例,这就是消息所说的。使用
Backgroundworker.IsBusy
查看它是否已经在那里运行。不过,用户交互并不重要
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