WPF/VB에서 응용 프로그램을 작성하고 비즈니스 논리와 UI를 다른 프로젝트로 구분했습니다.Dispatcher.CheckAccess()가 내 콘솔 응용 프로그램에서 작동하지 않습니다. 더 좋은 방법이 있습니다.
비즈니스 계층은 다른 스레드에서 실행되는 직렬 포트를 사용합니다. 이제 동일한 비즈니스 계층에 대한 명령 줄 인터페이스를 작성하려고 했으므로 .Invoke()가 호출 될 때 오류가 발생하는 것 같습니다. (오류 없음, 그냥 작동하지 않습니다)
나는 checkaccess 및 .invoke에 추가해야하는 이유는 분명히 알았습니다. 직렬 포트 데이터를 처리하는 동안 변경 될 수있는 콜렉션이 있었고 NotifyCollectionChanged를 WPF 데이터 바인딩으로 처리 할 수 있습니다. (내가 100 % 확신하지 못하는 이유는 몇 달 전 필자가 그 부분을 썼기 때문에 GUI에서 위력을 발휘했기 때문에 이제는 콘솔 앱을 추가하면이 점을 다시 생각하게되었습니다)
내 비즈니스 계층은 생성 된 스레드에서 이러한 프로세스를 실행하기 위해 GUI 버전과 명령 줄 버전 모두에서 작동해야합니다.
비즈니스 계층에서 Dispatcher를 잘못 사용하고 있습니까? 직렬 포트에서 이벤트를 처리 한 다음 주 스레드로 돌아가 데이터를 처리하는 더 좋은 방법이 있습니까?
업데이트 :
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
는 WPF 적절한 사용하지 않는 경우, SynchronizationContext에 안전하게 크로스 스레드를 보낼 수있는 기능을 제공하는 것보다 낮은 수준의 접근 방식을 사용하는 것이 좋습니다. –