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í 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 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ů:
Volání
EndOperationName
z hlavního vlákna aplikace, které 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.AsyncWaitHandle K blokování provádění aplikace použijte, 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ů:
Dotazování na stav dokončení operace kontrolou IsCompleted vlastnosti pravidelně a voláním
EndOperationName
po dokončení operace. 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.