0

ここでは、vb のマルチスレッドを使用して結び目を作っています。追加ハンドラ アドレスを使用して 4 つのイベントをサブスクライブし、メイン フォームの関数をポイントする作業プログラムがあります。私は、関数ごとに4つの一意のアドレスのそれぞれを期待して、まったく同じことを行う4つの個別の関数を持っています。それらには呼び出しが必要であり、関数の先頭で私のデリゲートを呼び出します。関数が行うことは、別のプロセスのスレッドを生成し、それに処理を渡すことだけです。

プログラムを使用して、サブスクリプションの 1 つからのイベントを処理すると、すべてがうまく機能します。2 を処理し始めると少し遅くなり、次に 4 を処理すると本当に詰まります。サブスクライブされた各イベントを生成すると、それらはすべて同時に発生するため、ウィンドウは同時に 4 つの要求を取得し、おそらくそれらをキューに入れ、それらを処理します。したがって、これは私のアプリケーションの 1 つのボトルネックです。

可能かどうか疑問に思ったのは、サブスクライブされたイベント (つまり、ハンドラー アドレスを追加すること) を別のスレッドに向け、発生したイベントを複数のスレッドで非同期に処理することでした。そのため、それらをキューに入れません。 1スレッドで。2 つのアプリケーションを実行し、そのうちの 2 つの分割されたイベントを処理できるため、それが可能であることはわかっています。これにより、パフォーマンスが向上します。4 つの個別のアプリケーションを実行する場合も同様です。

私はすべての適切なビットを持っていることを知っていますが、それを正しい順序で完全につなぎ合わせることができません.

Public Class MainUI

Public Sub start()
    AddHandler MyEvent.EventHasHappened, AddressOf OnthisUI
    AddHandler ThreadedRoutine.Callback, AddressOf HandedBAck
End Sub

Delegate Sub On_thisUI()
Public Sub OnthisUI()

    If InvokeRequired Then
        'create a pointer to this function
        Dim MyDel As New On_thisUI(AddressOf OnthisUI)
        'call this same function from this thread
        Dim Eventargs() As Object = {sender, e}
        Invoke(MyDel, Eventargs)
        Return
    End If

    Dim Handmeoff As New ThreadedRoutine
    Dim newThread As New System.Threading.Thread(AddressOf Handmeoff.handoffexecution)
    newThread.Start()

End Sub

Public Sub HandedBAck()
    ' Update UI in here

End Sub

End Class

Public Class ThreadedRoutine
Public Shared Event Callback()
Public Sub handoffexecution()
    ' Do some work in here
    RaiseEvent Callback()

End Sub
End Class

大まかな例で申し訳ありませんが、これは私が現在行っていることをかなり強調しています

myevent.eventhashappened は、mainUI スレッドを使用してイベントを受信し、受信時に他のプログラム スレッドにパントするのではなく、複数のスレッドで同時に実行したいサブスクリプションです。

Addhandler サブスクリプションを別のクラスに配置し、そのインスタンスをこのように呼び出すことを考えました

Public Class Subscribe
Public Sub New()
    AddHandler myevent.eventhashappened, AddressOf HandleMyEvent
End Sub

Public Sub HandleMyEvent()

End Sub 
End Class

次に、このように4つのリスナークラスを宣言するだけです

Dim MyHandler1 as new Subscribe
Dim MyHandler2 as new Subscribe
Dim MyHandler3 as new Subscribe
Dim MyHandler4 as new Subscribe

それはうまくいくでしょうか?

私がここで起こっていることを示そうとしていることを明確にするために

myevent.eventhappened は、最初に追加するフックです。外部イベントによって定期的にこれが発生します (現時点ではわかりやすくするためにコードには示されていません)

これにより、イベントを処理する新しいプロセスのスレッドを生成する ui のルーチンがトリガーされ、いくつかの処理 (これも表示されていません) が実行され、スレッドが開始され、スレッドが完了すると、更新するいくつかのパラメーターを使用して ui にコールバックされます。 (再び表示されません)

私の希望する動作は、その初期フックを開始し、UI ではない別のスレッドでも処理することです。ある時点で常に UI に戻る必要がありますが、パイプラインの最初のボトルネックを解消したかったのです。

よろしく

4

0 に答える 0