Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 为什么主窗体具有来自不同线程的不同散列?_Vb.net_Multithreading_Task Parallel Library - Fatal编程技术网

Vb.net 为什么主窗体具有来自不同线程的不同散列?

Vb.net 为什么主窗体具有来自不同线程的不同散列?,vb.net,multithreading,task-parallel-library,Vb.net,Multithreading,Task Parallel Library,据我所知,这里的主窗体我称之为Form1,因为.NETWindows窗体应用程序的默认窗体有点像一个单例。它的特殊之处在于,您只需使用Form1就可以从任何地方访问实例;即使只有一个表单实例,也可以访问它,而无需传递变量 然而,我惊讶地发现,如果我使用TPL生成许多任务,并将它们一起运行,并且每个任务都调用Form1.GetHashCode,它们将返回不同的值 此外,如果我在mainform中放置一个公共成员对象,然后在它的一个属性上设置一个值,这将不会反映在任务中 这里发生了什么-好像每个任务

据我所知,这里的主窗体我称之为Form1,因为.NETWindows窗体应用程序的默认窗体有点像一个单例。它的特殊之处在于,您只需使用Form1就可以从任何地方访问实例;即使只有一个表单实例,也可以访问它,而无需传递变量

然而,我惊讶地发现,如果我使用TPL生成许多任务,并将它们一起运行,并且每个任务都调用Form1.GetHashCode,它们将返回不同的值

此外,如果我在mainform中放置一个公共成员对象,然后在它的一个属性上设置一个值,这将不会反映在任务中

这里发生了什么-好像每个任务都有一个新实例,但这不可能是正确的吗?这肯定需要大量的记忆/初始化,而且我看不到很多形式。我知道我不能从其他线程访问控件,但这只是一个整数。发生了什么事

示例代码

只需创建一个新项目并将其填充到Form1 one中,表单上只需一个按钮

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

表单类是一个vb.net灾难。即使GetHashCode方法需要对象,也可以编写Form1.GetHashCode。Form1不是对象名,而是类型名。它仍然有效,这可以追溯到VB的古代版本,当时还没有类。在线程中使用Form1将创建Form1类的新实例。当然还有另一个散列码。+1用于调用这个VB灾难!这是一场多么可怕的噩梦!谢谢@HansPassant,所以我猜正确的解决方案是传递form对象还是创建一个合适的单例?