Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.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_Events_Delegates - Fatal编程技术网

在VB.NET中的新线程上引发事件

在VB.NET中的新线程上引发事件,vb.net,multithreading,events,delegates,Vb.net,Multithreading,Events,Delegates,我需要从新线程上的表单引发事件。 (我不相信这样做的原因是相关的,但以防万一:如果处理事件的代码在表单[如msgbox]上阻塞了某些内容,我将从表单的WndProc sub中的代码引发事件。),然后各种各样的问题都会在断开连接的上下文中发生。我已经确认,在新线程上引发事件可以解决问题。) 这就是我目前正在做的: Public Event MyEvent() Public Sub RaiseMyEvent() RaiseEvent MyEvent End Sub Protected O

我需要从新线程上的表单引发事件。

(我不相信这样做的原因是相关的,但以防万一:如果处理事件的代码在表单[如msgbox]上阻塞了某些内容,我将从表单的WndProc sub中的代码引发事件。),然后各种各样的问题都会在断开连接的上下文中发生。我已经确认,在新线程上引发事件可以解决问题。)

这就是我目前正在做的:

Public Event MyEvent()

Public Sub RaiseMyEvent()
    RaiseEvent MyEvent
End Sub

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Dim t As New Threading.Thread(AddressOf RaiseMyEvent)
    t.Start()
End Sub
有更好的方法吗?


据我所知,VB中的事件实际上是由背景中的代理组成的。有没有办法在新线程中引发事件而不为每个线程创建子线程?或者,我是否应该使用更合适的方法?

不知道这是否有帮助,但我会一直执行线程和类似的事件:

Event MyEvent(ByVal Var1 As String, ByVal Var2 As String)

Private Delegate Sub del_MyEvent(ByVal Var1 As String, ByVal Var2 As String)

Private Sub StartNewThread()
    'MAIN UI THREAD

    Dim sVar1 As String = "Test"
    Dim sVar2 As String = "Second Var"

    Dim oThread As New Threading.Thread(New Threading.ParameterizedThreadStart(AddressOf StartNewThread_Threaded))
    With oThread
        .IsBackground = True
        .Priority = Threading.ThreadPriority.BelowNormal
        .Name = "StartNewThread_Threaded"

        .Start(New Object() {sVar1, sVar2})
    End With
End Sub
Private Sub StartNewThread_Threaded(ByVal o As Object)
    'CHILD THREAD
    Dim sVar1 As String = o(0)
    Dim sVar2 As String = o(1)

    'Do threaded operation
    Threading.Thread.Sleep(1000)

    'Raise event
    RaiseEvent_MyEvent(sVar1, sVar2)

End Sub

Public Sub RaiseEvent_MyEvent(ByVal Var1 As String, ByVal Var2 As String)

    If Me.InvokeRequired Then
        'Makes the sub threadsafe (I.e. the event will only be raised in the UI Thread)
        Dim oDel As New del_MyEvent(AddressOf RaiseEvent_MyEvent)
        Me.Invoke(oDel, Var1, Var2)
        Exit Sub
    End If

    'MAIN UI THREAD
    RaiseEvent MyEvent(Var1, Var2)
End Sub
Public Class Class1

    Public Event MyEvent()

    Sub Demo()
        Dim t As New Threading.Thread(Sub() RaiseEvent MyEvent())
        t.Start()
    End Sub

End Class

您可以按如下方式删除RaiseMyEvent子项:

Event MyEvent(ByVal Var1 As String, ByVal Var2 As String)

Private Delegate Sub del_MyEvent(ByVal Var1 As String, ByVal Var2 As String)

Private Sub StartNewThread()
    'MAIN UI THREAD

    Dim sVar1 As String = "Test"
    Dim sVar2 As String = "Second Var"

    Dim oThread As New Threading.Thread(New Threading.ParameterizedThreadStart(AddressOf StartNewThread_Threaded))
    With oThread
        .IsBackground = True
        .Priority = Threading.ThreadPriority.BelowNormal
        .Name = "StartNewThread_Threaded"

        .Start(New Object() {sVar1, sVar2})
    End With
End Sub
Private Sub StartNewThread_Threaded(ByVal o As Object)
    'CHILD THREAD
    Dim sVar1 As String = o(0)
    Dim sVar2 As String = o(1)

    'Do threaded operation
    Threading.Thread.Sleep(1000)

    'Raise event
    RaiseEvent_MyEvent(sVar1, sVar2)

End Sub

Public Sub RaiseEvent_MyEvent(ByVal Var1 As String, ByVal Var2 As String)

    If Me.InvokeRequired Then
        'Makes the sub threadsafe (I.e. the event will only be raised in the UI Thread)
        Dim oDel As New del_MyEvent(AddressOf RaiseEvent_MyEvent)
        Me.Invoke(oDel, Var1, Var2)
        Exit Sub
    End If

    'MAIN UI THREAD
    RaiseEvent MyEvent(Var1, Var2)
End Sub
Public Class Class1

    Public Event MyEvent()

    Sub Demo()
        Dim t As New Threading.Thread(Sub() RaiseEvent MyEvent())
        t.Start()
    End Sub

End Class

为什么你需要在一个新的主题上提出一个事件?@Matt,阅读我的帖子,第一段斜体字。我需要在WndProc内部发起活动。如果处理这些事件的代码需要WndProc消息才能工作,则会发生崩溃,因为WndProc被阻止。