J'ai écrit une application dans WPF/VB et séparé la logique métier et l'interface utilisateur dans différents projets. La couche de gestion utilise un port série qui s'exécute sur un thread différent. Maintenant que j'essaie d'écrire une interface de ligne de commande pour la même couche de gestion, elle semble échouer lorsque .Invoke() est appelée. (pas d'erreur, ne fonctionne pas)Dispatcher.CheckAccess() ne fonctionne pas à partir de mon application de console, est-il un meilleur moyen
Je suis assez sûr que la raison pour laquelle j'ai dû ajouter checkaccess et .invoke était parce que j'ai des collections qui seraient changées pendant le traitement des données de port série et voulaient que NotifyCollectionChanged être géré par la liaison de données WPF. (La raison pour laquelle je ne suis pas sûr à 100% est que j'ai écrit cette partie il y a quelques mois et tout a bien fonctionné depuis l'interface graphique, maintenant l'application console m'a fait repenser)
Je voudrais ma couche de gestion pour exécuter ces processus sur le thread ils ont été créés, j'ai besoin de cela à la fois de ma version de l'interface graphique et la version de ligne de commande. Est-ce que j'utilise mal Dispatcher dans ma couche de gestion? Existe-t-il un meilleur moyen de gérer un événement à partir du port série, puis de revenir au thread principal pour traiter les données?
Mise à jour:
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
Si ne pas utiliser WPF approprié, envisagez d'utiliser SynchronizationContext, une approche plus bas niveau pour offrir la possibilité d'envoyer en toute sécurité cross-fil. –