Condividi tramite


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

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 BeginNomeOperazione anziché su un thread ThreadPool diverso.

IsCompleted

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.

NotaNota

In questi due scenari non definiti ai responsabili dell'implementazione è consigliata la generazione di InvalidOperationException.

NotaNota

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