Я написал приложение в WPF / VB и разделил бизнес-логику и пользовательский интерфейс на разные проекты.
Бизнес-уровень использует последовательный порт, который работает в другом потоке. Теперь, когда я пытаюсь написать интерфейс командной строки для того же бизнес-уровня, кажется, что происходит сбой при вызове .Invoke (). (без ошибок, просто не работает)
Я почти уверен, что причина, по которой мне пришлось добавить в checkaccess и .invoke, была в том, что у меня есть коллекции, которые будут изменены при обработке данных последовательного порта, и я хотел, чтобы NotifyCollectionChanged обрабатывался привязкой данных WPF.
(Причина, по которой я не уверен на 100%, заключается в том, что несколько месяцев назад я написал эту часть, и все это прекрасно работало в графическом интерфейсе, а теперь добавление консольного приложения заставило меня переосмыслить часть этого)
Мне бы хотелось, чтобы мой бизнес-уровень запускал эти процессы в том потоке, в котором они были созданы. Мне нужно, чтобы он работал как с моей версией графического интерфейса, так и с версией командной строки.
Неправильно ли я использую Диспетчер на своем бизнес-уровне? Есть ли лучший способ обработать событие от последовательного порта, а затем вернуться в основной поток для обработки данных?
Изменено:
Private Delegate Sub NewDataRecieved(ByVal byteBuffer() As Byte)
Private Sub DataReceived(ByVal byteBuffer() As Byte) Handles _serial.DataRecieved
If _dispatcher.CheckAccess() Then
ProcessTheData
Else
Dim dataReceivedDelegate As NewDataRecieved
dataReceivedDelegate = New NewDataRecieved(AddressOf DataReceived)
_dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, dataReceivedDelegate, byteBuffer)
End If
End Sub