Cenni preliminari sulla programmazione asincrona
L'implementazione di un'operazione asincrona che utilizza il modello di progettazione IAsyncResult avviene mediante due metodi, denominati BeginNomeOperazione e EndNomeOperazione, che rispettivamente avviano e terminano l'operazione asincrona NomeOperazione. La classe FileStream fornisce ad esempio i metodi BeginRead e EndRead per la lettura asincrona dei byte da un file. Tali metodi implementano la versione asincrona del metodo Read.
Dopo aver chiamato il metodo BeginNomeOperazione, un'applicazione può continuare a eseguire le istruzioni sul thread chiamante mentre l'operazione asincrona viene eseguita su un altro thread. Per ogni chiamata a BeginNomeOperazione, l'applicazione deve chiamare anche il metodo EndNomeOperazione per ottenere i risultati dell'operazione.
Avvio di un'operazione asincrona
Il metodo BeginNomeOperazione avvia l'operazione asincrona NomeOperazione e restituisce un oggetto che implementa l'interfaccia IAsyncResult. Gli oggetti IAsyncResult memorizzano informazioni sulle operazioni asincrone. Nella tabella riportata di seguito sono riportate le informazioni relative a un'operazione asincrona.
Membro |
Descrizione |
---|---|
Oggetto facoltativo specifico dell'applicazione che contiene informazioni sull'operazione asincrona. |
|
Oggetto WaitHandle che può essere utilizzato per bloccare l'esecuzione dell'applicazione fino al completamento dell'operazione asincrona. |
|
Valore che indica l'eventuale completamento dell'operazione asincrona sul thread utilizzato per chiamare il metodo BeginNomeOperazione anziché su un thread ThreadPool diverso. |
|
Valore che indica l'eventuale completamento dell'operazione asincrona. |
Un metodo BeginNomeOperazione accetta tutti i parametri dichiarati nella firma della versione sincrona associata, passati per valore o per riferimento. Nella firma del metodo BeginNomeOperazione non sono inclusi parametri out. Sono invece inclusi due parametri aggiuntivi, il primo dei quali definisce un delegato AsyncCallback che fa riferimento a un metodo chiamato al completamento dell'operazione asincrona. Il chiamante può specificare null (Nothing in Visual Basic) se non desidera richiamare un metodo al termine dell'operazione. Il secondo parametro aggiuntivo è un oggetto definito dall'utente che può essere utilizzato per passare informazioni sullo stato specifiche dell'applicazione al metodo richiamato al completamento dell'operazione asincrona. Se un metodo BeginNomeOperazione accetta altri parametri specifici dell'operazione, quale una matrice di byte per la memorizzazione dei byte letti da un file, l'oggetto AsyncCallback e l'oggetto stato dell'applicazione saranno gli ultimi parametri nella firma del metodo BeginNomeOperazione.
BeginNomeOperazione restituisce immediatamente il controllo al thread chiamante. Se il metodo BeginNomeOperazionegenera eccezioni, la generazione avviene prima dell'avvio dell'operazione asincrona e il metodo di callback non viene richiamato.
Fine di un'operazione asincrona
Il metodo EndNomeOperazione termina l'operazione asincrona NomeOperazione. Il valore restituito da tale metodo è dello stesso tipo restituito dalla controparte sincrona ed è specifico dell'operazione asincrona. Il metodo EndRead restituisce ad esempio il numero di byte letti da un oggettoFileStream mentre il metodo EndGetHostByName restituisce un oggetto IPHostEntry contenente le informazioni relative a un computer host. Il metodo EndNomeOperazione accetta tutti i parametri out o ref dichiarati nella firma della versione sincrona associata. Oltre ai parametri provenienti dal metodo sincrono, il metodo EndNomeOperazione comprende anche un parametro IAsyncResult. I chiamanti devono passare l'istanza restituita dalla chiamata corrispondente al metodo BeginNomeOperazione.
Se l'operazione asincrona rappresentata dall'oggetto IAsyncResult non è stata completata quando viene chiamato il metodo EndNomeOperazione, quest'ultimo blocca il thread chiamante fino al completamento dell'operazione. Le eccezioni generate dall'operazione asincrona vengono generate dal metodo EndNomeOperazione. Non è definito l'effetto della chiamata ripetuta del metodo EndNomeOperazione con lo stesso oggetto IAsyncResult, come anche della chiamata di tale metodo con un oggetto IAsyncResult non restituito dal metodo Begin correlato.
Nota |
---|
In questi due scenari non definiti ai responsabili dell'implementazione è consigliata la generazione di InvalidOperationException. |
Nota |
---|
I responsabili dell'implementazione di questo modello di progettazione devono notificare al chiamante il completamento dell'operazione asincrona impostando IsCompleted su true, chiamando il metodo di callback asincrono, se specificato, e segnalando l'oggetto AsyncWaitHandle. |
Gli sviluppatori di applicazioni dispongono di diverse scelte di progettazione per accedere ai risultati dell'operazione asincrona. La scelta adeguata dipende dall'eventuale presenza nell'applicazione di istruzioni che possano essere eseguite durante il completamento dell'operazione. Se l'applicazione non consente di eseguire altre attività fino alla ricezione dei risultati dell'operazione asincrona, deve essere bloccata fino a quel momento. A tale scopo, sono disponibili i due approcci illustrati di seguito.
Chiamare il metodo EndNomeOperazione dal thread principale dell'applicazione, bloccando l'esecuzione dell'applicazione fino al completamento dell'operazione. Per un esempio relativo all'utilizzo di questa tecnica, vedere Blocco dell'esecuzione dell'applicazione terminando un'operazione asincrona.
Utilizzare AsyncWaitHandle per bloccare l'esecuzione dell'applicazione fino al completamento di una o più operazioni. Per un esempio relativo all'utilizzo di questa tecnica, vedere Blocco dell'esecuzione dell'applicazione tramite AsyncWaitHandle.
Per le applicazioni che non è necessario bloccare durante il completamento dell'operazione asincrona, è possibile utilizzare uno degli approcci seguenti:
Effettuare il polling dello stato di completamento dell'operazione verificando periodicamente la proprietà IsCompleted e chiamando il metodo EndNomeOperazione al completamento dell'operazione. Per un esempio relativo all'utilizzo di questa tecnica, vedere Esecuzione del polling dello stato di un'operazione asincrona.
Utilizzare un delegato AsyncCallback per specificare il metodo da richiamare quando l'operazione viene completata. Per un esempio relativo all'utilizzo di questa tecnica, vedere Utilizzo di un delegato AsyncCallback per terminare un'operazione asincrona.
Vedere anche
Concetti
Chiamata asincrona dei metodi sincroni
Utilizzo di un oggetto di stato e di un delegato AsyncCallback