.net добавить обработчик многопоточности

Я здесь завязываюсь с многопоточностью в VB. У меня есть рабочая программа, на которую я подписываюсь на 4 события, используя адрес обработчика добавления и указываю на функцию в моей главной форме. У меня есть 4 отдельные функции, которые все делают то же самое, что ожидают для каждого из 4 уникальных адресов для каждой из функций. Они требуют вызова, вызывают мой делегат в верхней части функций, а затем все, что делает функция, это порождает поток другого процесса и передает ему обработку.

Когда я использую программу и обрабатываю события из одной из подписок, все работает отлично. Когда я начинаю обрабатывать 2, он становится немного медленнее, затем я делаю 4, и он действительно засоряется. Когда я генерирую каждое из подписанных событий, все они происходят в одно и то же время, поэтому окна будут получать 4 запроса одновременно и, по-видимому, ставить их в очередь и работать через них. Так что это 1 узкое место в моем приложении.

Что меня интересовало, можно ли это сделать, так это указать, что подписанные события (то есть, что я делаю с адресом добавления обработчика) в другом потоке и обработанные события обрабатываются асинхронно в нескольких потоках, поэтому я не ставлю их в очередь на 1 нить. Я знаю, что это возможно, потому что я могу запустить 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 - это крюк, который я добавляю в начале. Внешнее событие периодически вызывает это (не показано в коде для ясности в настоящее время)

Затем он запускает подпрограмму в пользовательском интерфейсе, которая порождает поток нового процесса, который обрабатывает событие, выполняет некоторую обработку (также не показана), запускает поток, и когда поток завершается, он вызывает пользовательский интерфейс с некоторыми параметрами для обновления. (опять не показано)

Мое желаемое поведение состоит в том, чтобы этот начальный хук был инициирован и также обрабатывался в другом потоке, который не является пользовательским интерфейсом. Мне всегда приходится возвращаться к пользовательскому интерфейсу в какой-то момент, но я хотел устранить первое узкое место в конвейере.

С уважением

0 ответов

Другие вопросы по тегам