我在这里用vb中的多线程把自己绑起来。我有一个工作程序,我使用添加处理程序地址订阅 4 个事件,并指向我的主窗体上的一个函数。我有 4 个独立的函数,它们对每个函数的 4 个唯一地址中的每一个都执行完全相同的操作。他们需要调用,在函数顶部调用我的委托,然后该函数所做的就是生成另一个进程的线程并将处理移交给它。
当我使用该程序并处理来自其中一个订阅的事件时,一切都很好。当我开始处理 2 时它变得有点慢,然后我处理 4 并且它真的堵塞了。当我生成每个订阅的事件时,它们都同时发生,因此 Windows 会同时收到 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.eventthappened 是我在开始时添加的钩子。外部事件会定期引发此事件(为清楚起见,目前未在代码中显示)
然后这会触发 ui 中的一个例程,该例程会产生一个处理事件的 New 进程的线程,执行一些处理(也未显示),启动线程,当线程完成时,它会使用一些参数回调到 ui 以更新(再次未显示)
我希望的行为是启动初始挂钩并在另一个不是 UI 的线程上处理。我总是不得不在某个时候返回 UI,但我想清除管道中的第一个瓶颈。
问候