Vb.net 在线程中引用对象(类)失败

Vb.net 在线程中引用对象(类)失败,vb.net,multithreading,class,Vb.net,Multithreading,Class,在线程中引用对象(类)失败 我有一个对象(“vb类”),它需要在一个单独的线程上运行并与U/I通信 即使使用示例代码,我也无法让对象在线程中运行。我用两个例子来说明这个问题。第一个调用表单中的函数,它可以完美地工作。第二个创建一个对象并执行相同的调用,但失败。 示例#1[工作](在表单中调用) 在表单中调用函数时,控制台的输出为: 表单中的线程样本 表单中的线程样本已完成 在新线程内部… OfActionToBeruInThread 这是我所期望的。线程已异步启动。结束得非常快,函数知道它在一

在线程中引用对象(类)失败

我有一个对象(“vb类”),它需要在一个单独的线程上运行并与U/I通信

即使使用示例代码,我也无法让对象在线程中运行。我用两个例子来说明这个问题。第一个调用表单中的函数,它可以完美地工作。第二个创建一个对象并执行相同的调用,但失败。


示例#1[工作](在表单中调用)

在表单中调用函数时,控制台的输出为:
表单中的线程样本
表单中的线程样本已完成
在新线程内部…
OfActionToBeruInThread

这是我所期望的。线程已异步启动。结束得非常快,函数知道它在一个线程中




示例#2[不工作](调用相同的函数,但这次在对象中)
在第二个示例中,我使用一个包含类的外部文件,并以相同的方式创建线程。

以下是主要形式:


以下是包含类定义的外部文件:

公共类对象测试 ActionToBeruInThreadDelegate()的私有委托子对象 函数的公共子函数 如果需要frmInitial.invoker,则 Console.WriteLine(“新线程内…”) Invoke(新的OfActionToBerninThreadDelegate(OfActionToBerninThread的地址)) 其他的 Console.WriteLine(“OfActionToBeruInThread”) 如果结束 端接头 末级 在本例中,输出表明函数没有在单独的线程中运行如下所示:

已启动使用对象的线程示例。
使用对象的线程示例已完成。
OfActionToBeruInThread




摘要:当线程创建对象时,该对象似乎不是在线程内部实际运行,否则form.InvokeRequired将为true。我还有其他更复杂的例子,这些例子得到了有力的验证和证明,但我提供了这两个例子,作为我问题的一个非常简单的演示。

我如何让一个线程“拥有”一系列单独的对象,以便这些对象异步运行,并在调试代码后独立地向U/I报告,看来frmInitial.invokererequired未能正确执行

=======================================================

因此,我再次回来(当然有一个解决方案):


相信我,这比为我的数值分析考试而学习要好:-)

调试代码后,frmInitial.invokererequired似乎无法正确执行

=======================================================

因此,我再次回来(当然有一个解决方案):


相信我,这比为我的数值分析考试而学习要好:-)

这是真的。当函数是表单“Me.invokererequired”的成员时,返回True。但是,如果函数是类的成员,“frmInitial.InvokeRequired”返回false。知道为什么吗?我真的被难住了。谢谢你花时间看这个。太棒了!非常感谢。我明天要试试这个。这很有道理,谢谢,这很有效。我仍然有点困惑于线程的整体,但我相信我可以将其融入到项目中。非常感谢你!只是更新一下。。。我现在有(最多)十个动态生成的线程,每个线程做复杂的数学运算,每个线程独立地更新屏幕。。。我希望你毁了那个数值分析考试!为什么要大惊小怪呢?毕竟,除非需要,否则要避免使用线程。顺便说一句,这是大量的工作,我不是专业人士,但我在编码方面有一个愿景,无意冒犯,但你似乎试图通过分配给我来摆脱你的工作:-)我仍然是一名毕业生,嗯,高年级毕业生,没有工作;这是真的。当函数是表单“Me.invokererequired”的成员时,返回True。但是,如果函数是类的成员,“frmInitial.InvokeRequired”返回false。知道为什么吗?我真的被难住了。谢谢你花时间看这个。太棒了!非常感谢。我明天要试试这个。这很有道理,谢谢,这很有效。我仍然有点困惑于线程的整体,但我相信我可以将其融入到项目中。非常感谢你!只是更新一下。。。我现在有(最多)十个动态生成的线程,每个线程做复杂的数学运算,每个线程独立地更新屏幕。。。我希望你毁了那个数值分析考试!为什么要大惊小怪呢?毕竟,除非需要,否则要避免使用线程。顺便说一句,这是大量的工作,我不是专业人士,但我在编码方面有一个愿景,无意冒犯,但你似乎试图通过分配给我来摆脱你的工作:-)我仍然是一名毕业生,嗯,高年级毕业生,没有工作;你可能是链接问题答案最后一段的另一个受害者。汉斯,这可能是重复的。。。也许对一个更敏锐的眼睛或理解。我看不出他们是怎么一样的。谢谢你的链接。你可能是链接问题答案最后一段的另一个受害者。汉斯,可能是重复的。。。也许对一个更敏锐的眼睛或理解。我看不出他们是怎么一样的。谢谢你的链接。
 Private Delegate Sub FuctionToBeRunInThreadDelegate

 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    Console.WriteLine("Thread sample within FORM")

    Dim Thread As New System.Threading.Thread(AddressOf FuctionToBeRunInThread)
    Thread.Start()

    Console.WriteLine("Thread sample within FORM completed")

 End Sub

 Public Sub FuctionToBeRunInThread()

    If Me.InvokeRequired Then
        Console.WriteLine("Inside new thread....")
        Me.Invoke(New FuctionToBeRunInThreadDelegate(AddressOf FuctionToBeRunInThread))
    Else
        Console.WriteLine("oFuctionToBeRunInThread")
    End If

  End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click

    Console.WriteLine("Thread sample using object started.")

    Dim oEngine As New objTest()
    Dim oThread As New System.Threading.Thread(AddressOf oEngine.oFuctionToBeRunInThread)
    oThread.Start()

    Console.WriteLine("Thread sample using object completed.")


End Sub
Public Class objTest Private Delegate Sub oFuctionToBeRunInThreadDelegate() Public Sub oFuctionToBeRunInThread() If frmInitial.InvokeRequired Then Console.WriteLine("Inside new thread....") frmInitial.Invoke(New oFuctionToBeRunInThreadDelegate(AddressOf oFuctionToBeRunInThread)) Else Console.WriteLine("oFuctionToBeRunInThread") End If End Sub End Class
Public Class frmInitial

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Console.WriteLine("event started")

        Dim obj As New ObjTest()
        Dim threadobj As New System.Threading.Thread(AddressOf obj.dosomework)
        threadobj.Name = "debugme"

        'passing the current form reference to the thread function
        threadobj.Start(Me)

        Console.WriteLine("event completed")
    End Sub
End Class
Public Class ObjTest
        Private Delegate Sub dosomeworkDelegate(ByVal f As Form)

        Public Sub dosomework(ByVal f As Form)
            ' Check if the form can be accessed from the current thread.
            If Not f.InvokeRequired Then
                ' Access the form directly.
                Console.WriteLine("delegate executed")
                f.Controls("textbox1").Text = "thread invoked successfuly"
            Else
                ' Marshal to the thread that owns the form. 
                Dim del As dosomeworkDelegate = AddressOf dosomework
                Dim param As Object() = {f}
                Console.WriteLine("executing delegate")
                f.BeginInvoke(del, param)
            End If
        End Sub

End Class