Ho una certa familiarità con il multithreading in quanto ne ho letto ma non l'ho mai usato nella pratica.C# Multithreading - Richiama senza controllo
Ho un progetto che utilizza una libreria di terze parti che condivide lo stato di un dispositivo di input aumentando gli eventi. Il problema è che il modo in cui la libreria è scritta questi eventi viene sollevata da un thread diverso.
La mia applicazione non ha bisogno di essere multi-threaded e ho incontrato un sacco di problemi di threading classici (i controlli dell'interfaccia lamentano di essere interagiti da un thread diverso, le raccolte che vengono modificate man mano che un pezzo di codice sta iterando su di esso, ecc.).
Voglio solo che l'evento della libreria di terze parti venga restituito al mio thread dell'interfaccia utente. In particolare, ciò che penso dovrebbe accadere è:
La mia classe riceve l'evento e il gestore viene eseguito su un thread diverso rispetto all'interfaccia utente. Voglio rilevare questa condizione (come con InvokeRequired) e quindi eseguire l'equivalente di BeginInvoke per restituire il controllo al thread dell'interfaccia utente. Quindi le notifiche appropriate possono essere inviate sulla gerarchia di classi e tutti i miei dati vengono toccati solo da un thread.
Il problema è che la classe che riceve questi eventi di input non è derivata da Control e pertanto non dispone di InvokeRequired o BeginInvoke. Il motivo è che ho cercato di separare nettamente l'interfaccia utente e la logica sottostante. La classe è ancora in esecuzione sul thread dell'interfaccia utente, ma non ha alcuna interfaccia utente all'interno della classe stessa.
In questo momento ho risolto il problema rovinando questa separazione. Trasmetto un riferimento al controllo che visualizzerà i dati dalla mia classe e utilizzando i metodi i metodi Invoke. Sembra che sconfigga l'intero scopo di separarli perché ora la classe sottostante ha una dipendenza diretta dalla mia specifica classe UI.
Forse c'è un modo per salvare un riferimento al thread che ha eseguito il costruttore e quindi c'è qualcosa nello spazio dei nomi Threading che eseguirà i comandi Invoke?
C'è un modo per aggirare questo? Il mio approccio è completamente sbagliato?
Mi ci è voluto un po 'per capire come vengono utilizzati i delegati ma funziona! – colithium