Domanda

Gli eventi sono sincroni in C#.Ho questa applicazione in cui il mio modulo principale avvia un thread con un loop al suo interno che ascolta un flusso.Quando qualcosa arriva nello stream, viene generato un evento dal loop al modulo principale.

Se il modulo principale è lento o mostra una finestra di messaggio o qualcosa del genere, il ciclo verrà sospeso.Qual è il modo migliore per aggirare questo problema?Utilizzando una richiamata e un'invocazione sul modulo principale?

È stato utile?

Soluzione

Hmmm, ho utilizzato diversi scenari a seconda di ciò di cui avevo bisogno in quel momento.

Credo che BeginInvoke sarebbe probabilmente il più semplice da codificare dato che sei quasi arrivato.In ogni caso dovresti già utilizzare Invoke, quindi passa semplicemente a BeginInvoke.L'utilizzo di una richiamata su un thread separato realizzerà la stessa cosa (a patto di utilizzare il pool di thread per accodare la richiamata) dell'utilizzo di BeginInvoke.

Altri suggerimenti

Dato che stai utilizzando un modulo, il modo più semplice è utilizzare il file BackgroundWorker componente.

La classe di backgroundworker consente di eseguire un'operazione su un thread separato e dedicato.Le operazioni che richiedono tempo come download e transazioni di database possono far sembrare la tua interfaccia utente (UI) come se abbia smesso di rispondere mentre sono in esecuzione.Quando si desidera un'interfaccia utente reattiva e si trova di fronte a lunghi ritardi associati a tali operazioni, la classe di background fornisce una soluzione conveniente.

Gli eventi sono giusti delegati, quindi usa BeginInvoke.(Vedere Effettuare chiamate di metodi asincroni nell'ambiente .NET)

Hai alcune opzioni, come già spiegato in dettaglio, ma secondo la mia esperienza, è meglio lasciare i delegati e BeginInvoke e utilizzare invece BackgroundWorker (v2.0+), poiché è più facile da usare e ti consente anche di interagire con modulo principale al completamento del thread.Tutto sommato ho trovato una soluzione implementata molto bene.

System.ComponentModel.BackgroundWorker è davvero un buon punto di partenza.Farà il tuo lavoro asincrono, ti darà notifiche di eventi importanti e avrà modi per integrarsi meglio con i tuoi moduli.

Ad esempio, puoi attivare le notifiche di avanzamento registrando un gestore per l'evento ProgressChanged.(che è altamente raccomandato se hai un processo lungo e asincrono e non vuoi che il tuo utente pensi che l'applicazione si sia bloccata)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top