ここでは、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 に戻る必要がありますが、パイプラインの最初のボトルネックを解消したかったのです。
よろしく