.net添加处理程序多线程

时间:2018-07-28 18:37:25

标签: vb.net add handler cross-thread

我在这里用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.eventhappened是我一开始添加的钩子。外部事件会定期引发此事件(为清晰起见,目前未在代码中显示)

然后触发ui中的一个例程,该例程生成一个 处理该事件的新进程进行一些处理(也未显示),启动线程,并在线程完成后调用带有一些要更新的参数的ui(再次未显示)

我希望的行为是启动初始挂钩,并在不是UI的另一个线程上进行处理。我总是必须在某个时候返回UI,但是我想清除管道中的第一个瓶颈。

致谢

0 个答案:

没有答案