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 BeginOperationName
kan 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 (Nothing
in 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 BeginOperationName
geretourneerd.
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:
Peiling voor voltooiingsstatus van bewerking door de IsCompleted eigenschap periodiek te controleren en aan te roepen
EndOperationName
wanneer de bewerking is voltooid. Zie Polling voor de status van een asynchrone bewerking voor een voorbeeld dat deze techniek illustreert.Gebruik een AsyncCallback gemachtigde om een methode op te geven die moet worden aangeroepen wanneer de bewerking is voltooid. Zie Een AsyncCallback-gemachtigde gebruiken om een asynchrone bewerking te beëindigen voor een voorbeeld dat deze techniek illustreert.