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.

Notitie

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 die is voltooid op de thread die is gebruikt om aan te roepen BeginOperationName , in plaats van op een afzonderlijke ThreadPool thread te voltooien.
IsCompleted Een waarde die aangeeft of de asynchrone bewerking is voltooid.

Een BeginOperationName methode gebruikt parameters die zijn gedeclareerd in de handtekening van de synchrone versie van de methode die worden doorgegeven door waarde of verwijzing. 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 (Nothingin Visual Basic) opgeven null 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 retourneert direct het besturingselement naar 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 haalt eventuele uit- of verw-parameters op die zijn gedeclareerd in de handtekening van de synchrone versie van de methode. Naast de parameters van de synchrone methode bevat de EndOperationName methode ook een IAsyncResult parameter. Bellers moeten het exemplaar doorgeven dat door de bijbehorende aanroep wordt BeginOperationNamegeretourneerd.

Als de asynchrone bewerking die wordt vertegenwoordigd door het IAsyncResult object niet is voltooid wanneer EndOperationName het wordt aangeroepen, EndOperationName blokkeert u de aanroepende thread totdat de asynchrone bewerking is voltooid. Uitzonderingen die worden gegenereerd door de asynchrone bewerking, worden gegenereerd vanuit de EndOperationName methode. 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.

Notitie

Voor een van de niet-gedefinieerde scenario's moeten implementeerfuncties overwegen om te gooien InvalidOperationException.

Notitie

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:

  • Aanroepen EndOperationName vanuit de hoofdthread van de toepassing, waardoor de uitvoering van de toepassing wordt geblokkeerd totdat de bewerking is voltooid. Zie Toepassingsuitvoering blokkeren door een Asynchrone bewerking te beëindigen voor een voorbeeld dat deze techniek illustreert.

  • Gebruik de AsyncWaitHandle opdracht om de uitvoering van toepassingen te blokkeren totdat een of meer bewerkingen zijn voltooid. Zie Toepassingsuitvoering blokkeren met behulp van een AsyncWaitHandle voor een voorbeeld dat deze techniek illustreert.

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

Zie ook