Sfondo
Il mio programma comunica con un dispositivo che è solitamente asincrono, ma a volte può comportarsi in modo sincrono. Ho un gestore di eventi che utilizzo per ricevere i dati in modo asincrono, quindi ho un gestore di eventi separato che utilizzo quando il dispositivo è in modalità sincrona. Quindi, quando ho bisogno di comunicare con il dispositivo in modo sincrono, annuncerò l'iscrizione dal gestore asincrono e mi iscriverò al gestore sincrono come segue:
try
{
// temporarily receive data synchronously
this.myDevice.DataReceived
-= this.AsynchronousHandler;
this.myDevice.DataReceived
+= new SerialDataReceivedEventHandler(this.SynchronousHandler);
// do the communication...
}
finally
{
// go back to receiving asynchronously
this.myDevice.DataReceived
-= this.SynchronousHandler;
this.myDevice.DataReceived
+= new SerialDataReceivedEventHandler(this.AsynchronousHandler);
}
Ora, quello che sto anticipando è che potrebbe esserci un qualche tipo di problema con la sottoscrizione / annullamento della sottoscrizione nella clausola finally
. Ora, mi rendo conto che ciò sarà altamente improbabile, perché il processo abbonamento è l'ultima dichiarazione della clausola finally
... Tuttavia, supponiamo che io riceva alcuni dati mentre finally
la clausola è ancora in esecuzione e il gestore dell'evento viene chiamato.
Domanda
L'evento verrà gestito correttamente anche se è stato gestito mentre una clausola finally
è ancora in esecuzione? Oppure, non importa affatto?