Modello di programmazione asincrona (APM)Asynchronous Programming Model (APM)

Un'operazione asincrona in cui viene usato il modello di progettazione dell'oggetto IAsyncResult viene implementata come due metodi denominati BeginOperationName e EndOperationName tramite cui viene rispettivamente avviata e terminata l'operazione asincrona NomeOperazione.An asynchronous operation that uses the IAsyncResult design pattern is implemented as two methods named BeginOperationName and EndOperationName that begin and end the asynchronous operation OperationName respectively. La classe FileStream fornisce ad esempio i metodi BeginRead e EndRead per la lettura asincrona dei byte da un file.For example, the FileStream class provides the BeginRead and EndRead methods to asynchronously read bytes from a file. Tali metodi implementano la versione asincrona del metodo Read .These methods implement the asynchronous version of the Read method.

Nota

A partire da .NET Framework 4, Task Parallel Library fornisce un nuovo modello di programmazione asincrona e parallela.Starting with the .NET Framework 4, the Task Parallel Library provides a new model for asynchronous and parallel programming. Per altre informazioni, vedere Task Parallel Library (TPL) e Task-based Asynchronous Pattern (TAP).For more information, see Task Parallel Library (TPL) and Task-based Asynchronous Pattern (TAP)).

Dopo aver chiamato il metodo BeginOperationName, l'app può continuare a eseguire le istruzioni nel thread chiamante mentre l'operazione asincrona viene eseguita in un altro thread.After calling BeginOperationName, an application can continue executing instructions on the calling thread while the asynchronous operation takes place on a different thread. Per ogni chiamata a BeginOperationName, l'app deve chiamare anche il metodo EndOperationName per ottenere i risultati dell'operazione.For each call to BeginOperationName, the application should also call EndOperationName to get the results of the operation.

Avvio di un'operazione asincronaBeginning an Asynchronous Operation

Il metodo BeginOperationName avvia l'operazione asincrona NomeOperazione e restituisce un oggetto che implementa l'interfaccia IAsyncResult.The BeginOperationName method begins asynchronous operation OperationName and returns an object that implements the IAsyncResult interface. Gli oggettiIAsyncResult archiviano le informazioni sulle operazioni asincrone.IAsyncResult objects store information about an asynchronous operation. La tabella seguente illustra le informazioni relative a un'operazione asincrona.The following table shows information about an asynchronous operation.

MemberMember DescriptionDescription
AsyncState Oggetto facoltativo specifico dell'applicazione che contiene informazioni sull'operazione asincrona.An optional application-specific object that contains information about the asynchronous operation.
AsyncWaitHandle Oggetto WaitHandle che può essere usato per bloccare l'esecuzione dell'applicazione fino al completamento dell'operazione asincrona.A WaitHandle that can be used to block application execution until the asynchronous operation completes.
CompletedSynchronously Valore che indica l'eventuale completamento dell'operazione asincrona nel thread usato per chiamare il metodo BeginOperationName anziché in un thread ThreadPool separato.A value that indicates whether the asynchronous operation completed on the thread used to call BeginOperationName instead of completing on a separate ThreadPool thread.
IsCompleted Valore che indica l'eventuale completamento dell'operazione asincrona.A value that indicates whether the asynchronous operation has completed.

In un metodo BeginOperationName vengono accettati tutti i parametri dichiarati nella firma della versione sincrona del metodo passati per valore o riferimento.A BeginOperationName method takes any parameters declared in the signature of the synchronous version of the method that are passed by value or by reference. Nella firma del metodo BeginOperationName non sono inclusi parametri out.Any out parameters are not part of the BeginOperationName method signature. Il metodo BeginOperationName include invece due parametri aggiuntivi.The BeginOperationName method signature also includes two additional parameters. Il primo dei quali definisce un delegato AsyncCallback che fa riferimento a un metodo chiamato al completamento dell'operazione asincrona.The first of these defines an AsyncCallback delegate that references a method that is called when the asynchronous operation completes. Il chiamante può specificare null (Nothing in Visual Basic) se non vuole richiamare un metodo al termine dell'operazione.The caller can specify null (Nothing in Visual Basic) if it does not want a method invoked when the operation completes. Il secondo parametro aggiuntivo è un oggetto definito dall'utenteThe second additional parameter is a user-defined object. che può essere usato per passare informazioni sullo stato specifiche dell'applicazione al metodo richiamato al completamento dell'operazione asincrona.This object can be used to pass application-specific state information to the method invoked when the asynchronous operation completes. Se in un metodo BeginOperationName sono accettati altri parametri specifici dell'operazione, ad esempio una matrice di byte per l'archiviazione dei byte letti da un file, l'oggetto AsyncCallback e l'oggetto stato dell'applicazione saranno gli ultimi parametri nella firma del metodo BeginOperationName.If a BeginOperationName method takes additional operation-specific parameters, such as a byte array to store bytes read from a file, the AsyncCallback and application state object are the last parameters in the BeginOperationName method signature.

Il metodo BeginOperationName restituisce immediatamente il controllo al thread chiamante.BeginOperationName returns control to the calling thread immediately. Se il metodo BeginOperationName genera eccezioni, ciò avviene prima dell'avvio dell'operazione asincronaIf the BeginOperationName method throws exceptions, the exceptions are thrown before the asynchronous operation is started. e il metodo BeginOperationNamedi callback non viene richiamato.If the BeginOperationName method throws exceptions, the callback method is not invoked.

Fine di un'operazione asincronaEnding an Asynchronous Operation

Il metodo EndOperationName termina l'operazione asincrona NomeOperazione.The EndOperationName method ends asynchronous operation OperationName. Il valore restituito dal metodo EndOperationName è dello stesso tipo restituito dalla controparte sincrona ed è specifico dell'operazione asincrona.The return value of the EndOperationName method is the same type returned by its synchronous counterpart and is specific to the asynchronous operation. Il metodo EndRead restituisce ad esempio il numero di byte letti da un oggetto FileStream mentre il metodo EndGetHostByName restituisce un oggetto IPHostEntry contenente le informazioni relative a un computer host.For example, the EndRead method returns the number of bytes read from a FileStream and the EndGetHostByName method returns an IPHostEntry object that contains information about a host computer. Il metodo EndOperationName accetta tutti i parametri out o ref dichiarati nella firma della versione sincrona del metodo.The EndOperationName method takes any out or ref parameters declared in the signature of the synchronous version of the method. Oltre ai parametri provenienti dal metodo sincrono, nel metodo EndOperationName è incluso anche un parametro IAsyncResult.In addition to the parameters from the synchronous method, the EndOperationName method also includes an IAsyncResult parameter. I chiamanti devono passare l'istanza restituita dalla chiamata corrispondente al metodo BeginOperationName.Callers must pass the instance returned by the corresponding call to BeginOperationName.

Se l'operazione asincrona rappresentata dall'oggetto IAsyncResult non è stata completata quando viene chiamato il metodo EndOperationName, EndOperationNamequest'ultimo blocca il thread chiamante fino al completamento dell'operazione.If the asynchronous operation represented by the IAsyncResult object has not completed when EndOperationName is called, EndOperationName blocks the calling thread until the asynchronous operation is complete. Le eccezioni generate dall'operazione asincrona vengono generate dal metodo EndOperationName.Exceptions thrown by the asynchronous operation are thrown from the EndOperationName method. Non è definito l'effetto della chiamata ripetuta del metodo EndOperationName con lo stesso oggetto IAsyncResult,The effect of calling the EndOperationName method multiple times with the same IAsyncResult is not defined. come anche della chiamata del metodo EndOperationName con un oggetto IAsyncResult non restituito dal metodo Begin correlato.Likewise, calling the EndOperationName method with an IAsyncResult that was not returned by the related Begin method is also not defined.

Nota

In questi due scenari non definiti ai responsabili dell'implementazione è consigliata la generazione di InvalidOperationException.For either of the undefined scenarios, implementers should consider throwing InvalidOperationException.

Nota

I responsabili dell'implementazione di questo schema progettuale 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.Implementers of this design pattern should notify the caller that the asynchronous operation completed by setting IsCompleted to true, calling the asynchronous callback method (if one was specified) and signaling the AsyncWaitHandle.

Gli sviluppatori di applicazioni dispongono di diverse scelte di progettazione per accedere ai risultati dell'operazione asincrona.Application developers have several design choices for accessing the results of the asynchronous operation. La scelta adeguata dipende dall'eventuale presenza nell'applicazione di istruzioni che possono essere eseguite durante il completamento dell'operazione.The correct choice depends on whether the application has instructions that can execute while the operation completes. Se l'applicazione non consente di eseguire altre attività fino alla ricezione dei risultati dell'operazione asincrona, deve essere bloccata fino a quel momento.If an application cannot perform any additional work until it receives the results of the asynchronous operation, the application must block until the results are available. A tale scopo, sono disponibili i due approcci illustrati di seguito:To block until an asynchronous operation completes, you can use one of the following approaches:

Per le applicazioni che non è necessario bloccare durante il completamento dell'operazione asincrona, è possibile usare uno degli approcci seguenti:Applications that do not need to block while the asynchronous operation completes can use one of the following approaches:

Vedere ancheSee also