2012-02-13 3 views
4

新しいスレッドのフォームからイベントを発生させる必要があります。VB.NETの新しいスレッドでイベントを発生させる

(これは関連性が高いとは思えませんが、私はフォームのWndProcサブコード内のコードからイベントを発生させています。 [などのMsgBoxなど]、その後、トラブルのすべての種類は、切断されたコンテキストで発生し、何が私は新しいスレッドで調達イベントは、問題を修正することを確認してきたではない)これは私が現在やっているものです

:。。

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のイベントは、実際にはバックグラウンドでデリゲートで構成されていると私は理解しています。新しいスレッドでイベントを発生させる方法はありますか?または、私が使用すべきより適切な方法がありますか?

+0

を新しいスレッドでイベントを発生させる必要がありますか? –

+0

@Matt、私の記事、イタリック体の最初の段落を読んでください。私はWndProc内でイベントを起こす必要があります。これらのイベントを処理するコードがWndProcメッセージを処理する必要がある場合、WndProcがブロックされるため、クラッシュが発生します。 – Brad

答えて

4

あなたはこのようなRaiseMyEventサブ排除することができます:あなたはなぜ

Public Class Class1 

    Public Event MyEvent() 

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

End Class 
4

これが役立つかどうか分からないのですが、私は常にスレッドと、このようなイベントやる:

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 
関連する問題