Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
Chiamare
EndOperationName
dal thread principale dell'applicazione, bloccando l'esecuzione dell'applicazione fino al completamento dell'operazione. Per un esempio che illustra questa tecnica, vedere Blocco dell'esecuzione dell'applicazione terminando un'operazione asincrona.Usare AsyncWaitHandle per bloccare l'esecuzione dell'applicazione finché non vengono completate una o più operazioni. Per un esempio che illustra questa tecnica, vedere Blocco dell'esecuzione dell'applicazione tramite asyncWaitHandle.
Le applicazioni che non devono bloccare mentre l'operazione asincrona viene completata possono usare uno degli approcci seguenti:
Eseguire il polling dello stato di completamento dell'operazione controllando periodicamente la IsCompleted proprietà e chiamando
EndOperationName
al termine dell'operazione. Per un esempio che illustra questa tecnica, vedere Interrogazione dello stato di un'operazione asincrona.Usare un AsyncCallback delegato per specificare un metodo da richiamare al termine dell'operazione. Per un esempio che illustra questa tecnica, vedere Uso di un delegato AsyncCallback per terminare un'operazione asincrona.
Vedere anche
- Event-based Asynchronous Pattern (EAP) (Modello asincrono basato su eventi, EAP)
- Chiamare metodi sincroni in modalità asincrona
- Uso di un delegato AsyncCallback e di un oggetto State