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

AsyncState

Oggetto facoltativo specifico dell'applicazione che contiene informazioni sull'operazione asincrona.

AsyncWaitHandle

Oggetto WaitHandle che può essere utilizzato per bloccare l'esecuzione dell'applicazione fino al completamento dell'operazione asincrona.

CompletedSynchronously

Valore che indica l'eventuale completamento dell'operazione asincrona sul thread utilizzato per chiamare il metodo BeginOperationName anziché su un thread ThreadPool diverso.

IsCompleted

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.

Per le applicazioni che non è necessario bloccare durante il completamento dell'operazione asincrona, è possibile utilizzare uno degli approcci seguenti:

Vedere anche

Concetti

Chiamata asincrona dei metodi sincroni
Utilizzo di un oggetto di stato e di un delegato AsyncCallback

Altre risorse

Modelli di progettazione della programmazione asincrona