Dela via


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 BeginOperationNamekan 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 BeginOperationNamebö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:

Program som inte behöver blockeras när den asynkrona åtgärden har slutförts kan använda någon av följande metoder:

Se även