据我所知,.Net windows表单应用程序的主要表单(此处我称之为Form1
为默认值)有点像单身。它似乎很特别,你只需使用Form1
即可从任何地方访问实例;即使您只有一个表单实例,也可以在不传递变量的情况下访问它。
然而,我很惊讶地发现,如果我使用TPL完成许多任务并将它们一起运行,并且每个任务都调用Form1.GetHashCode
,它们会返回不同的值。
此外,如果我将公共成员对象放在mainform
内,则在其中一个属性上设置一个值,但不会反映在任务中。
这里发生了什么 - 就好像每个任务都有一个新实例,但那可能不对?这肯定需要大量的记忆/初始化,而且我也不能看许多表格。我知道我无法从其他线程访问控件,但这只是一个整数。发生了什么事?
示例代码
只需创建一个新项目并将其填入Form1,然后在该表单上单个按钮。
Imports System.Threading.Tasks
Imports System.Threading
Public Class Form1
Public foo As New Test
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
foo.bar = 99
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ThisCouldBeAnywhere()
Dim Task1 As New Task(AddressOf ThisCouldBeAnywhere)
Dim Task2 As New Task(AddressOf ThisCouldBeAnywhere)
Dim Task3 As New Task(AddressOf ThisCouldBeAnywhere)
Task1.Start()
Task2.Start()
Task3.Start()
End Sub
End Class
Public Class Test
Public bar As Integer = 4
End Class
Public Module TestMod
Public Sub ThisCouldBeAnywhere()
MsgBox(Form1.GetHashCode & vbCrLf & Form1.foo.bar)
End Sub
End Module