【发布时间】:2012-11-29 20:56:05
【问题描述】:
我将首先给出一个我正在处理的简化示例
我有一个 Windows 窗体 - 让我们称之为“formA”,在 formA 上我有一个按钮,在按钮的属性中我设置为可见 = false。 我有一个名为 MainLoop 的不同类
Public class MainLoop
sub new()
end sub
public sub run()
If someCondition then
formA.ButtonName.Visible = True
End if
end sub
end class
我在这个应用程序中运行了不止一个线程,并且一个线程一直通过这个“公共子运行”循环运行,直到满足某些条件。通过调试和单步执行应用程序,我确信它正在运行设置可见性 = true 的行。但是按钮只是没有出现在我的表单上。我已经确认这不是一个简单的拼写错误或任何其他问题 - 似乎我在这里遗漏了一个基本逻辑。
我试过了
dim TempForm as new formA
然后在我尝试的 IF 语句中
TempForm.ButtonName.Visible = true
但这正在创建表单的一个新实例 - 它实际上并没有设置我正在使用的按钮的当前表单。
感谢任何帮助。
【问题讨论】:
-
在需要 对象变量 的地方使用 类型名称 是一个可怕的 vb.net 陷阱。当您使用线程时,它永远不会失败,它为您提供了一个新的表单对象。使用 TempForm 是一种解决方法的尝试,但落入了完全相同相同的陷阱,您不想更改新表单实例上按钮的可见性。您需要用户正在查看的那个。通过停止尝试从线程更新 UI 来取得成功。 BackgroundWorker 是样板类,可让您远离此类麻烦。
标签: vb.net winforms multithreading