Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 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 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:
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.