Model asynchronního programování (APM)

Asynchronní operace, která používá vzor návrhu IAsyncResult , je implementována jako dvě pojmenované BeginOperationName metody a EndOperationName které začínají a končí asynchronní operace OperationName v uvedeném pořadí. FileStream Například třída poskytuje BeginRead a metody pro asynchronní EndRead čtení bajtů ze souboru. Tyto metody implementují asynchronní verzi Read metody.

Poznámka:

Počínaje rozhraním .NET Framework 4 poskytuje paralelní knihovna úloh nový model pro asynchronní a paralelní programování. Další informace najdete v tématu Paralelní knihovna úloh (TPL) a asynchronní vzor založený na úlohách (TAP)).

Po volání BeginOperationNamemůže aplikace pokračovat v provádění pokynů ve volajícím vlákně, zatímco asynchronní operace probíhá na jiném vlákně. Pro každé volání BeginOperationNameby aplikace měla také volat EndOperationName , aby získala výsledky operace.

Zahájení asynchronní operace

Metoda BeginOperationName zahájí asynchronní operaci OperationName a vrátí objekt, který implementuje IAsyncResult rozhraní. IAsyncResult objekty ukládají informace o asynchronní operaci. Následující tabulka obsahuje informace o asynchronní operaci.

Člen Popis
AsyncState Volitelný objekt specifický pro aplikaci, který obsahuje informace o asynchronní operaci.
AsyncWaitHandle To WaitHandle lze použít k blokování provádění aplikace, dokud asynchronní operace nekončí.
CompletedSynchronously Hodnota, která označuje, zda asynchronní operace byla dokončena ve vlákně použité k volání BeginOperationName namísto dokončení v samostatném ThreadPool vlákně.
IsCompleted Hodnota, která označuje, jestli byla dokončena asynchronní operace.

Metoda BeginOperationName přebírá všechny parametry deklarované v podpisu synchronní verze metody, které jsou předány hodnotou nebo odkazem. Žádné výstupní parametry nejsou součástí BeginOperationName podpisu metody. Podpis BeginOperationName metody obsahuje také dva další parametry. První z nich definuje AsyncCallback delegát, který odkazuje na metodu, která je volána při dokončení asynchronní operace. Volající může určit null (Nothing v jazyce Visual Basic), pokud nechce, aby metoda vyvolána při dokončení operace. Druhý další parametr je objekt definovaný uživatelem. Tento objekt lze použít k předání informací o stavu specifické pro aplikaci metodě vyvolané při dokončení asynchronní operace. BeginOperationName Pokud metoda přebírá další parametry specifické pro operace, jako je pole bajtů k ukládání bajtů načtených ze souboru, AsyncCallback objekt stavu aplikace a objekt stavu aplikace jsou poslední parametry v BeginOperationName podpisu metody.

BeginOperationName vrátí ovládací prvek volajícímu vláknu okamžitě. BeginOperationName Pokud metoda vyvolá výjimky, výjimky jsou vyvolány před zahájením asynchronní operace. Pokud metoda BeginOperationName vyvolá výjimky, metoda zpětného volání není vyvolána.

Ukončení asynchronní operace

Metoda EndOperationName ukončí asynchronní operaci OperationName. Návratová EndOperationName hodnota metody je stejný typ vrácený jeho synchronním protějškem a je specifický pro asynchronní operaci. Například EndRead metoda vrátí počet bajtů přečtených z a FileStreamEndGetHostByName metoda vrátí IPHostEntry objekt, který obsahuje informace o hostitelském počítači. Metoda EndOperationName vezme všechny parametry out nebo ref deklarované v podpisu synchronní verze metody. Kromě parametrů z synchronní metody EndOperationName zahrnuje IAsyncResult metoda také parametr. Volající musí předat instanci vrácenou odpovídajícím voláním .BeginOperationName

Pokud asynchronní operace reprezentovaná IAsyncResult objektem nebyla dokončena při EndOperationName volání, EndOperationName blokuje volající vlákno, dokud asynchronní operace není dokončena. Výjimky vyvolané asynchronní operací jsou vyvolány z EndOperationName metody. Účinek volání EndOperationName metody vícekrát se stejnými IAsyncResult není definován. Stejně tak volání EndOperationName metody s IAsyncResult , který nebyl vrácen související Begin metoda také není definován.

Poznámka:

U některého z nedefinovaných scénářů by implementátoři měli zvážit vyvolání InvalidOperationException.

Poznámka:

Implementátory tohoto vzoru návrhu by měly volajícímu oznámit, že asynchronní operace byla dokončena nastavením IsCompleted true, voláním asynchronní metody zpětného volání (pokud byla zadána) a signalizovat AsyncWaitHandle.

Vývojáři aplikací mají několik možností návrhu pro přístup k výsledkům asynchronní operace. Správná volba závisí na tom, jestli má aplikace pokyny, které se můžou spustit, když se operace dokončí. Pokud aplikace nemůže provést žádnou další práci, dokud neobdrží výsledky asynchronní operace, musí aplikace blokovat, dokud nebudou k dispozici výsledky. Pokud chcete blokovat, dokud se asynchronní operace neskončí, můžete použít jeden z následujících přístupů:

Aplikace, které nemusí blokovat, zatímco se asynchronní operace dokončí, můžou použít jeden z následujících přístupů:

Viz také