Cenni preliminari sulla programmazione asincrona
L'implementazione di un'operazione asincrona che utilizza il modello di progettazione IAsyncResult avviene mediante due metodi, denominati BeginOperationName e EndOperationName, che rispettivamente avviano e terminano l'operazione asincrona OperationName. 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 BeginOperationName, 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 BeginOperationName, l'applicazione deve chiamare anche il metodo EndOperationName per ottenere i risultati dell'operazione.
Avvio di un'operazione asincrona
Il metodo BeginOperationName avvia l'operazione asincrona OperationName 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 BeginOperationName anziché su un thread ThreadPool diverso. |
|
Valore che indica l'eventuale completamento dell'operazione asincrona. |
Un metodo BeginOperationName accetta tutti i parametri dichiarati nella firma della versione sincrona associata, passati per valore o per riferimento. Nella firma del metodo BeginOperationName 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 BeginOperationName 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 BeginOperationName.
Begin OperationName restituisce immediatamente il controllo al thread chiamante. Se il metodo in questione genera 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 EndOperationName termina l'operazione asincrona OperationName. Il valore restituito da tale metodo è dello stesso tipo restituito dalla controparte sincrona ed è specifico dell'operazione asincrona. Il metodoEndRead 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 EndOperationName accetta tutti i parametri out o ref dichiarati nella firma della versione sincrona associata. Oltre ai parametri provenienti dal metodo sincrono, il metodo EndOperationName comprende anche un parametro IAsyncResult. I chiamanti devono passare l'istanza restituita dalla chiamata corrispondente al metodo BeginOperationName.
Se l'operazione asincrona rappresentata dall'oggetto IAsyncResult non è stata completata quando viene chiamato il metodo EndOperationName, quest'ultimo blocca il thread chiamante fino al completamento dell'operazione. Le eccezioni generate dall'operazione asincrona vengono lanciate dal metodo EndOperationName. Non è definito l'effetto della chiamata ripetuta del metodo EndOperationName con lo stesso oggetto IAsyncResult, come anche della chiamata di tale metodo con un oggetto 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 EndOperationName 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 EndOperationName 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