Delen via


Asynchroon programmeermodel (APM)

Een asynchrone bewerking die gebruikmaakt van het IAsyncResult ontwerppatroon wordt geïmplementeerd als twee methoden met de naam BeginOperationName en EndOperationName die respectievelijk de asynchrone bewerking OperationName beginnen en beëindigen. De klasse biedt bijvoorbeeld FileStream de BeginRead en EndRead methoden voor het asynchroon lezen van bytes uit een bestand. Met deze methoden wordt de asynchrone versie van de Read methode geïmplementeerd.

Opmerking

Vanaf .NET Framework 4 biedt de taakparallelbibliotheek een nieuw model voor asynchrone en parallelle programmering. Zie TPL (Task Parallel Library) en op taken gebaseerd Asynchroon patroon (TAP) voor meer informatie.

Na het aanroepen BeginOperationNamekan een toepassing doorgaan met het uitvoeren van instructies voor de aanroepende thread terwijl de asynchrone bewerking plaatsvindt op een andere thread. Voor elke aanroep naar BeginOperationName, moet de toepassing ook aanroepen EndOperationName om de resultaten van de bewerking op te halen.

Een asynchrone bewerking starten

De BeginOperationName methode begint asynchrone bewerking OperationName en retourneert een object dat de IAsyncResult interface implementeert. IAsyncResult objecten slaan informatie op over een asynchrone bewerking. In de volgende tabel ziet u informatie over een asynchrone bewerking.

Lid Beschrijving
AsyncState Een optioneel toepassingsspecifiek object dat informatie bevat over de asynchrone bewerking.
AsyncWaitHandle Een WaitHandle die kan worden gebruikt om de uitvoering van toepassingen te blokkeren totdat de asynchrone bewerking is voltooid.
CompletedSynchronously Een waarde die aangeeft of de asynchrone bewerking is voltooid op de thread die is gebruikt om BeginOperationName aan te roepen, in plaats van dat deze op een afzonderlijke ThreadPool-thread is voltooid.
IsCompleted Een waarde die aangeeft of de asynchrone bewerking is voltooid.

De BeginOperationName-methode gebruikt parameters die in de signatuur zijn gedeclareerd van de synchrone versie van de methode en die als waarde of referentie worden doorgegeven. Eventuele outparameters maken geen deel uit van de BeginOperationName methodehandtekening. De BeginOperationName methodehandtekening bevat ook twee extra parameters. De eerste van deze definieert een AsyncCallback gemachtigde die verwijst naar een methode die wordt aangeroepen wanneer de asynchrone bewerking is voltooid. De aanroeper kan null specificeren (Nothing in Visual Basic) als er geen methode moet worden aangeroepen wanneer de bewerking is voltooid. De tweede extra parameter is een door de gebruiker gedefinieerd object. Dit object kan worden gebruikt om toepassingsspecifieke statusgegevens door te geven aan de methode die wordt aangeroepen wanneer de asynchrone bewerking is voltooid. Als een BeginOperationName methode aanvullende bewerkingsspecifieke parameters gebruikt, zoals een bytematrix om bytes op te slaan die zijn gelezen uit een bestand, zijn het object en het AsyncCallback toepassingsstatusobject de laatste parameters in de BeginOperationName methodehandtekening.

BeginOperationName geeft onmiddellijk de controle terug aan de aanroepende thread. Als de BeginOperationName methode uitzonderingen genereert, worden de uitzonderingen gegenereerd voordat de asynchrone bewerking wordt gestart. Als de BeginOperationName methode uitzonderingen genereert, wordt de callback-methode niet aangeroepen.

Een asynchrone bewerking beëindigen

De EndOperationName methode beëindigt asynchrone bewerking OperationName. De retourwaarde van de EndOperationName methode is hetzelfde type dat wordt geretourneerd door de synchrone tegenhanger en is specifiek voor de asynchrone bewerking. De EndRead methode retourneert bijvoorbeeld het aantal bytes dat is gelezen uit een FileStream en de EndGetHostByName methode retourneert een IPHostEntry object dat informatie over een hostcomputer bevat. De EndOperationName methode ontvangt eventuele uit- of ref-parameters die zijn gedeclareerd in de signatuur van de synchrone versie van de methode. Naast de parameters van de synchrone methode bevat de EndOperationName methode ook een IAsyncResult parameter. Bellers moeten de instantie doorgeven die door de bijbehorende aanroep wordt geretourneerdBeginOperationName.

Als de asynchrone bewerking die wordt vertegenwoordigd door het IAsyncResult-object niet is voltooid wanneer EndOperationName wordt aangeroepen, blokkeert EndOperationName de aanroepende thread totdat de asynchrone bewerking is voltooid. Uitzonderingen die door de asynchrone bewerking worden opgeworpen, worden vanuit de EndOperationName methode opgeworpen. Het effect van het aanroepen van de EndOperationName methode meerdere keren met hetzelfde IAsyncResult is niet gedefinieerd. Op dezelfde manier wordt het aanroepen van de EndOperationName methode met een IAsyncResult methode die niet is geretourneerd door de gerelateerde Begin-methode, ook niet gedefinieerd.

Opmerking

Voor elk van de niet-gedefinieerde scenario's moeten implementatoren overwegen om InvalidOperationException te werpen.

Opmerking

Implementeerfuncties van dit ontwerppatroon moeten de aanroeper waarschuwen dat de asynchrone bewerking is voltooid door in te stellen IsCompleted op true, de asynchrone callback-methode aan te roepen (indien opgegeven) en de signalering van de AsyncWaitHandle.

Toepassingsontwikkelaars hebben verschillende ontwerpopties voor toegang tot de resultaten van de asynchrone bewerking. De juiste keuze is afhankelijk van of de toepassing instructies heeft die kunnen worden uitgevoerd terwijl de bewerking is voltooid. Als een toepassing geen extra werk kan uitvoeren totdat de resultaten van de asynchrone bewerking worden ontvangen, moet de toepassing blokkeren totdat de resultaten beschikbaar zijn. Als u wilt blokkeren totdat een asynchrone bewerking is voltooid, kunt u een van de volgende methoden gebruiken:

Toepassingen die niet hoeven te worden geblokkeerd terwijl de asynchrone bewerking is voltooid, kunnen een van de volgende methoden gebruiken:

Zie ook