为什么BackgroundWorker无限循环停止?

时间:2015-09-22 16:16:57

标签: vb.net loops backgroundworker

class MyModelSerializer(serializers.ModelSerializer):
    nested_field = MyOtherModelSerializer()

    class Meta:
        model = MyModel
        fields = ('field1', 'field2', 'field3')

点击Button1后,会出现Messagebox。点击“#34;返回" (输入)键一次又一次出现......但是当我永久地点击Return键时,差不多5秒后程序会给我一个运行时错误。

错误不是我的电脑中的英文,我翻译了它。它几乎是卑鄙的" BackgroundWorker很忙,不能同时做两个过程......"

我知道错误。这是因为在运行时尝试运行BackgroundWorker。在代码中它只是以RunWorkerCompleted事件开始。因此,如果"工作未完成&#34,它就无法再次启动34;。谁运行BackgroundWorker?

1 个答案:

答案 0 :(得分:0)

你需要阅读this post first,它谈到重入的危险以及对话(如MsgBox)如何解决问题。

在您的计划中执行的操作。对话框只能与在同一线程上创建的其他窗口进行模态对比。那个工作线程没有。因此,没有任何东西可以阻止您的Enter键按下被具有焦点的控件看到。 Button1的。请注意如何使用鼠标选择主窗口并单击按钮。 KABOOM。

这不会经常出错,你可以通过依靠Enter键来帮助它开始重复。它通常会被消息框窗口检测到。但并非总是如此,DoWork结束与重新启动之间存在分歧。足以让UI线程有机会看到击键。现在,Enter按键操作Button1,它再次启动BGW备份。 RunWorkerCompleted事件处理程序也是如此,它无法启动两次。 KABOOM。

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

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