abbonamento all'evento in fine clausola

2

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?

    
posta Snoop 17.06.2016 - 19:18
fonte

1 risposta

4

Non dovrebbe importare. I blocchi finally sono speciali, ma non sono speciali per il tuo programma.

Infine i blocchi sono speciali perché, ad esempio, il runtime ritarderà un'eccezione di interruzione del thread fino a quando il controllo non lascerà un blocco finale. (E se ora stai pensando "se ho un ciclo infinito all'interno di un blocco finally non significa che il thread non può essere interrotto?" Allora stai pensando correttamente. Questo è solo uno dei tanti motivi per cui provi ad abortire una discussione è una cattiva idea.)

Tuttavia, dal punto di vista del flusso di controllo, puoi pensare a finally come semplicemente un altro blocco di codice eseguito quando viene eseguito il blocco try . (Indipendentemente dal fatto che il blocco try venga eseguito normalmente o eccezionalmente.)

La mia preoccupazione qui non è l'ultima, ma piuttosto tutte le razze possibili. C'è un momento nel quale è avvenuta l'annullamento dell'iscrizione e l'iscrizione non è stata eseguita. Potrebbe un evento essere attivato in quel momento e poi perso, dal momento che non ci sono abbonati? In un singolo programma con thread, chiaramente no, ma supponiamo che l'origine dell'evento sia in esecuzione su un altro thread? C'è un breve spazio là dove non ci sono ascoltatori.

    
risposta data 17.06.2016 - 19:33
fonte

Leggi altre domande sui tag