Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Asynchronní operace, která používá vzor návrhu IAsyncResult, je implementována jako dvě metody, pojmenované BeginOperationName
a EndOperationName
, které v uvedeném pořadí začínají a končí asynchronní operaci OperationName. Například třída poskytuje metody FileStream a BeginRead pro asynchronní č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í BeginOperationName
můž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í BeginOperationName
by 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 operaci, jako například pole bajtů pro ukládání bytů načtených ze souboru, AsyncCallback a objekt stavu aplikace jsou posledními parametry v BeginOperationName
podpisu metody.
BeginOperationName
vrací řízení 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á hodnota EndOperationName
metody je stejného typu jako ta, kterou vrací její synchronní protějšek, 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 metody EndOperationName
. Účinek opakovaného volání metody EndOperationName
se stejnými IAsyncResult není definován. Stejně tak volání metody EndOperationName
s IAsyncResult , která nebyla vrácena související metodou Begin, také není definováno.
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ů:
Zavolejte
EndOperationName
z hlavního vlákna aplikace, což blokuje provádění aplikace, dokud se operace nedokončí. Příklad znázorňující tuto techniku najdete v tématu Blokování spuštění aplikace ukončením asynchronní operace.Použijte AsyncWaitHandle k blokování provádění aplikace, dokud nebude dokončena jedna nebo více operací. Příklad znázorňující tuto techniku naleznete v tématu Blokování provádění aplikace pomocí AsyncWaitHandle.
Aplikace, které nemusí blokovat, zatímco se asynchronní operace dokončí, můžou použít jeden z následujících přístupů:
Pravidelně kontrolujte stav dokončení operace pomocí vlastnosti IsCompleted a po dokončení operace volejte
EndOperationName
. Příklad znázorňující tuto techniku najdete v tématu Dotazování na stav asynchronní operace.Pomocí delegáta AsyncCallback určete metodu, která se má vyvolat při dokončení operace. Příklad znázorňující tuto techniku naleznete v tématu Použití delegáta AsyncCallback k ukončení asynchronní operace.