Asynkron programmeringsmodell (APM)
En asynkron åtgärd som använder IAsyncResult designmönstret implementeras som två metoder med namnet BeginOperationName
och EndOperationName
som påbörjar respektive avslutar den asynkrona åtgärden OperationName . Klassen tillhandahåller BeginRead till exempel FileStream metoderna och EndRead för att asynkront läsa byte från en fil. Dessa metoder implementerar den asynkrona versionen av Read metoden.
Kommentar
Från och med .NET Framework 4 tillhandahåller aktivitetsparallellt bibliotek en ny modell för asynkron och parallell programmering. Mer information finns i Task Parallel Library (TPL) och Task-based Asynchronous Pattern (TAP)).
När du har anropat BeginOperationName
kan ett program fortsätta att köra instruktioner på den anropande tråden medan den asynkrona åtgärden utförs i en annan tråd. För varje anrop till BeginOperationName
bör programmet också anropa EndOperationName
för att få resultatet av åtgärden.
Påbörja en asynkron åtgärd
Metoden BeginOperationName
påbörjar asynkron åtgärd OperationName och returnerar ett objekt som implementerar IAsyncResult gränssnittet. IAsyncResult objekt lagrar information om en asynkron åtgärd. I följande tabell visas information om en asynkron åtgärd.
Medlem | beskrivning |
---|---|
AsyncState | Ett valfritt programspecifikt objekt som innehåller information om den asynkrona åtgärden. |
AsyncWaitHandle | En WaitHandle som kan användas för att blockera programkörning tills den asynkrona åtgärden har slutförts. |
CompletedSynchronously | Ett värde som anger om den asynkrona åtgärden slutfördes på den tråd som användes för att anropa BeginOperationName i stället för att slutföras i en separat ThreadPool tråd. |
IsCompleted | Ett värde som anger om den asynkrona åtgärden har slutförts. |
En BeginOperationName
metod tar alla parametrar som deklarerats i signaturen för den synkrona versionen av metoden som skickas med värde eller referens. Eventuella utparametrar ingår inte i metodsignaturen BeginOperationName
. Metodsignaturen BeginOperationName
innehåller även två ytterligare parametrar. Den första av dessa definierar ett AsyncCallback ombud som refererar till en metod som anropas när den asynkrona åtgärden slutförs. Anroparen kan ange null
(Nothing
i Visual Basic) om den inte vill att en metod ska anropas när åtgärden är klar. Den andra ytterligare parametern är ett användardefinierat objekt. Det här objektet kan användas för att skicka programspecifik tillståndsinformation till den metod som anropas när den asynkrona åtgärden slutförs. Om en BeginOperationName
metod tar ytterligare åtgärdsspecifika parametrar, till exempel en bytematris för att lagra byte som lästs från en fil, AsyncCallback är objektet och programtillståndsobjektet de sista parametrarna i metodsignaturen BeginOperationName
.
BeginOperationName
returnerar kontrollen till den anropande tråden omedelbart. BeginOperationName
Om metoden utlöser undantag genereras undantagen innan den asynkrona åtgärden startas. BeginOperationName
Om metoden utlöser undantag anropas inte återanropsmetoden.
Avsluta en asynkron åtgärd
Metoden EndOperationName
avslutar den asynkrona åtgärden OperationName. Returvärdet för EndOperationName
metoden är samma typ som returneras av dess synkrona motsvarighet och är specifikt för den asynkrona åtgärden. Metoden returnerar till exempel EndRead antalet byte som lästs från en FileStream och EndGetHostByName metoden returnerar ett IPHostEntry objekt som innehåller information om en värddator. Metoden EndOperationName
tar ut eller referensparametrar som deklarerats i signaturen för metodens synkrona version. Förutom parametrarna från den synkrona metoden EndOperationName
innehåller metoden även en IAsyncResult parameter. Anropare måste skicka instansen som returneras av motsvarande anrop till BeginOperationName
.
Om den asynkrona åtgärd som representeras av IAsyncResult objektet inte har slutförts när EndOperationName
anropas EndOperationName
blockerar den anropande tråden tills den asynkrona åtgärden har slutförts. Undantag som genereras av den asynkrona åtgärden genereras från EndOperationName
metoden. Effekten av att anropa EndOperationName
metoden flera gånger med samma IAsyncResult definieras inte. På samma sätt definieras inte heller anrop av EndOperationName
metoden med en IAsyncResult som inte returnerades av den relaterade Begin-metoden.
Kommentar
För något av de odefinierade scenarierna bör implementerarna överväga att InvalidOperationExceptionkasta .
Kommentar
Implementerare av det här designmönstret bör meddela anroparen att den asynkrona åtgärden slutfördes genom att ställa in IsCompleted på sant, anropa den asynkrona återanropsmetoden (om en har angetts) och signalera AsyncWaitHandle.
Programutvecklare har flera designalternativ för att komma åt resultatet av den asynkrona åtgärden. Rätt val beror på om programmet har instruktioner som kan köras när åtgärden är klar. Om ett program inte kan utföra något ytterligare arbete förrän det tar emot resultatet av den asynkrona åtgärden måste programmet blockeras tills resultaten är tillgängliga. Om du vill blockera tills en asynkron åtgärd har slutförts kan du använda någon av följande metoder:
Anropa
EndOperationName
från programmets huvudtråd och blockera programkörningen tills åtgärden har slutförts. Ett exempel som illustrerar den här tekniken finns i Blockera programkörning genom att avsluta en Async-åtgärd.AsyncWaitHandle Använd för att blockera programkörning tills en eller flera åtgärder har slutförts. Ett exempel som illustrerar den här tekniken finns i Blockera programkörning med hjälp av en AsyncWaitHandle.
Program som inte behöver blockeras när den asynkrona åtgärden har slutförts kan använda någon av följande metoder:
Sök efter status för åtgärdens slutförande genom att kontrollera IsCompleted egenskapen regelbundet och anropa
EndOperationName
när åtgärden är klar. Ett exempel som illustrerar den här tekniken finns i Avsökning för status för en asynkron åtgärd.Använd ett AsyncCallback ombud för att ange en metod som ska anropas när åtgärden är klar. Ett exempel som illustrerar den här tekniken finns i Använda ett AsyncCallback-ombud för att avsluta en asynkron åtgärd.