Sono davvero imbarazzato nel fare una domanda così banale, ma il debug di alcuni software ora mi ha convinto di non capire veramente questo problema:Asincronia e eventi .NET?
Come funzionano gli eventi .NET da un'altitudine di 20.000 piedi? Non intendo il modello delegato/gestore di eventi e tutto questo. Quello che voglio dire è - qual è la foto GRANDE:
- Il codice A sta facendo qualcosa.
- Si verifica un trigger esterno. Supponiamo, ad esempio, che l'utente abbia fatto clic su un controllo.
- Una magia accade e il gestore di eventi per l'evento viene chiamato.
- un'altra magia accade dopo il gestore eventi restituisce.
Ora, qual è la magia? In che modo questo si riferisce ai thread? Il thread che esegue il mio codice viene interrotto quando si verifica l'evento, quindi riprende dopo il ritorno del gestore eventi? Ma ho cercato su google e found out che i gestori .NET vengano chiamati in modo sincrono nel thread originale. Quindi chi si occupa di fermare e riprendere il codice A? Cosa succede se gli eventi sono nidificati (ad esempio, l'evento 2 si verifica quando è in esecuzione il gestore eventi per l'evento 1)?
Edit: Per quanto ho capito le risposte dicono che la curva evento per il prossimo evento verrà eseguito solo dopo che il gestore di eventi attualmente in esecuzione termina. Ciò significa che il tuo codice non viene interrotto: la linea n verrà sempre eseguita immediatamente subito dopo la riga n-1 e immediatamente prima della riga n + 1. Tuttavia poco prima che ho postato la domanda che mi è stato il debug di un programma di controllo, attraverso l'automazione, Internet Explorer (utilizzando SWExplorerAutomation da Webius). Sono abbastanza sicuro che, come ero line-passo attraverso il codice mi è stato "rapito" :-) a qualche gestore di eventi e tornato alla posizione di interruzione nel codice una volta che gestore di eventi ha terminato la sua attività. Questo significa che o non capisci le risposte, o che il programma si comporta in modo diverso mentre sei passato attraverso il debugger!
Questo vale per le applicazioni WinForms, ma non dimenticare il caso più generale, in cui non è coinvolta alcuna pompa di messaggio. In questo caso, tutto viene eseguito in modo sincrono senza un mitigatore e non è implicata alcuna magia. – bzlm
@bzim Capisco il buon vecchio mulit-mailboxes, wake-me-up-when-a-message-arriva-if-I'm-with-a-higher-priority-than-the-correntemente-running-task model come nel buon vecchio RMX di Intel. Quello che non capisco è il gioco di prestigio di Windows. – Avi