Condividi tramite


Modello di programmazione asincrona (APM)

Un'operazione asincrona che usa il IAsyncResult modello di progettazione viene implementata come due metodi denominati BeginOperationName e EndOperationName che iniziano e terminano rispettivamente l'operazione asincrona OperationName . Ad esempio, la FileStream classe fornisce i BeginRead metodi e EndRead per leggere in modo asincrono i byte da un file. Questi metodi implementano la versione asincrona del Read metodo .

Annotazioni

A partire da .NET Framework 4, Task Parallel Library fornisce un nuovo modello per la programmazione asincrona e parallela. Per altre informazioni, vedere Task Parallel Library (TPL) e Modello asincrono basato su attività (TAP)).

Dopo aver chiamato BeginOperationName, un'applicazione può continuare a eseguire istruzioni sul thread chiamante mentre l'operazione asincrona avviene su un thread diverso. Per ogni chiamata a BeginOperationName, l'applicazione deve anche chiamare EndOperationName per ottenere i risultati dell'operazione.

Inizio di un'operazione asincrona

Il BeginOperationName metodo avvia l'operazione asincrona OperationName e restituisce un oggetto che implementa l'interfaccia IAsyncResult . IAsyncResult Gli oggetti archiviano informazioni su un'operazione asincrona. Nella tabella seguente vengono illustrate informazioni su un'operazione asincrona.

Membro Descrizione
AsyncState Oggetto facoltativo specifico dell'applicazione che contiene informazioni sull'operazione asincrona.
AsyncWaitHandle Oggetto WaitHandle che può essere usato per bloccare l'esecuzione dell'applicazione fino al completamento dell'operazione asincrona.
CompletedSynchronously Valore che indica se l'operazione asincrona è stata completata nel thread utilizzato per chiamare BeginOperationName anziché completare in un thread separato ThreadPool .
IsCompleted Valore che indica se l'operazione asincrona è stata completata.

Un BeginOperationName metodo accetta qualsiasi parametro dichiarato nella firma della versione sincrona del metodo che sia passato per valore o per riferimento. I parametri out non fanno parte della firma del BeginOperationName metodo. La firma del BeginOperationName metodo include anche due parametri aggiuntivi. Il primo di questi definisce un AsyncCallback delegato che fa riferimento a un metodo chiamato al completamento dell'operazione asincrona. Il chiamante può specificare null (Nothing in Visual Basic) se non vuole richiamare un metodo al termine dell'operazione. Il secondo parametro aggiuntivo è un oggetto definito dall'utente. Questo oggetto può essere usato per passare informazioni sullo stato specifiche dell'applicazione al metodo richiamato al termine dell'operazione asincrona. Se un BeginOperationName metodo accetta parametri aggiuntivi specifici dell'operazione, ad esempio una matrice di byte per archiviare i byte letti da un file, l'oggetto AsyncCallback e lo stato dell'applicazione sono gli ultimi parametri nella firma del BeginOperationName metodo.

BeginOperationName restituisce immediatamente il controllo al thread chiamato. Se il BeginOperationName metodo genera eccezioni, le eccezioni vengono generate prima dell'avvio dell'operazione asincrona. Se il BeginOperationName metodo genera eccezioni, il metodo di callback non viene richiamato.

Fine di un'operazione asincrona

Il EndOperationName metodo termina l'operazione asincrona OperationName. Il valore restituito del EndOperationName metodo è lo stesso tipo restituito dalla controparte sincrona ed è specifico dell'operazione asincrona. Ad esempio, il EndRead metodo restituisce il numero di byte letti da un FileStream oggetto e il EndGetHostByName metodo restituisce un IPHostEntry oggetto che contiene informazioni su un computer host. Il EndOperationName metodo accetta tutti i parametri out o ref dichiarati nella firma della versione sincrona del metodo. Oltre ai parametri del metodo sincrono, il EndOperationName metodo include anche un IAsyncResult parametro . I chiamanti devono passare l'istanza restituita dalla chiamata corrispondente a BeginOperationName.

Se l'operazione asincrona rappresentata dall'oggetto IAsyncResult non è stata completata quando EndOperationName viene chiamato, EndOperationName blocca il thread chiamante fino al completamento dell'operazione asincrona. Le eccezioni generate dall'operazione asincrona vengono generate dal EndOperationName metodo . L'effetto di chiamare il EndOperationName metodo più volte con lo stesso IAsyncResult metodo non è definito. Analogamente, anche la chiamata al EndOperationName metodo con un oggetto IAsyncResult non restituito dal metodo Begin correlato non è definita.

Annotazioni

Per ciascuno degli scenari non definiti, gli implementatori dovrebbero considerare di lanciare InvalidOperationException.

Annotazioni

Gli implementatori di questo modello di progettazione devono notificare al chiamante che l'operazione asincrona è stata completata impostando IsCompleted su true, chiamando il metodo di callback asincrono (se specificato) e segnalando .AsyncWaitHandle

Gli sviluppatori di applicazioni hanno diverse opzioni di progettazione per accedere ai risultati dell'operazione asincrona. La scelta corretta dipende dal fatto che l'applicazione disponga di istruzioni che possono essere eseguite durante il completamento dell'operazione. Se un'applicazione non può eseguire operazioni aggiuntive fino a quando non riceve i risultati dell'operazione asincrona, l'applicazione deve bloccarsi fino a quando non sono disponibili i risultati. Per bloccare fino al completamento di un'operazione asincrona, è possibile usare uno degli approcci seguenti:

Le applicazioni che non devono bloccare mentre l'operazione asincrona viene completata possono usare uno degli approcci seguenti:

Vedere anche