Udostępnij za pośrednictwem


Asynchroniczny model programowania (APM)

Operacja asynchroniczna używająca IAsyncResult wzorca projektu jest implementowana jako dwie metody o nazwie BeginOperationName i EndOperationName rozpoczynające się i kończące operację asynchroniczną OperationName odpowiednio. Na przykład klasa FileStream udostępnia metody BeginRead i EndRead do asynchronicznego odczytywania bajtów z pliku. Te metody implementują asynchroniczną wersję Read metody .

Uwaga / Notatka

Począwszy od programu .NET Framework 4, biblioteka równoległa zadań udostępnia nowy model programowania asynchronicznego i równoległego. Aby uzyskać więcej informacji, zobacz Task Parallel Library (TPL) i Asynchroniczny wzorzec oparty na zadaniach (TAP).

Po wywołaniu BeginOperationName, aplikacja może kontynuować wykonywanie instrukcji w wątku wywołującym, podczas gdy operacja asynchroniczna odbywa się w innym wątku. Dla każdego wywołania metody BeginOperationName aplikacja powinna również wywołać EndOperationName, aby uzyskać wyniki operacji.

Rozpoczynanie operacji asynchronicznej

Metoda BeginOperationName rozpoczyna operację asynchroniczną OperationName i zwraca obiekt, który implementuje IAsyncResult interfejs. IAsyncResult obiekty przechowują informacje o operacji asynchronicznej. W poniższej tabeli przedstawiono informacje o operacji asynchronicznej.

Członek Opis
AsyncState Opcjonalny obiekt specyficzny dla aplikacji zawierający informacje o operacji asynchronicznej.
AsyncWaitHandle Element WaitHandle , który może służyć do blokowania wykonywania aplikacji do momentu zakończenia operacji asynchronicznej.
CompletedSynchronously Wartość wskazująca, czy operacja asynchroniczna została ukończona w wątku, który został użyty do wywołania BeginOperationName zamiast ukończenia w osobnym wątku ThreadPool.
IsCompleted Wartość wskazująca, czy operacja asynchroniczna została ukończona.

Metoda BeginOperationName przyjmuje wszystkie parametry zadeklarowane w podpisie wersji synchronicznej metod, które są przekazywane przez wartość lub przez odwołanie. Parametry out nie są częścią sygnatury metody BeginOperationName. Podpis BeginOperationName metody zawiera również dwa dodatkowe parametry. Pierwszy z nich definiuje AsyncCallback delegata, który odwołuje się do metody, która jest wywoływana po zakończeniu operacji asynchronicznej. Obiekt wywołujący może określić null (Nothing w Visual Basic), jeśli nie chce, aby metoda była wywoływana po zakończeniu operacji. Drugi dodatkowy parametr jest obiektem zdefiniowanym przez użytkownika. Ten obiekt może służyć do przekazywania informacji o stanie specyficznym dla aplikacji do metody wywoływanej po zakończeniu operacji asynchronicznej. BeginOperationName Jeśli metoda przyjmuje dodatkowe parametry specyficzne dla operacji, takie jak tablica bajtów do przechowywania bajtów odczytanych z pliku, AsyncCallback obiekt stanu i aplikacji są ostatnimi parametrami w podpisie BeginOperationName metody.

BeginOperationName natychmiast zwraca kontrolę do wątku wywołującego. BeginOperationName Jeśli metoda zgłasza wyjątki, wyjątki są zgłaszane przed uruchomieniem operacji asynchronicznej. BeginOperationName Jeśli metoda zgłasza wyjątki, metoda wywołania zwrotnego nie jest wywoływana.

Kończenie operacji asynchronicznej

Metoda EndOperationName kończy asynchroniczną operację OperationName. Zwracana wartość EndOperationName metody jest tym samym typem zwracanym przez jego synchroniczny odpowiednik i jest specyficzna dla operacji asynchronicznej. Na przykład metoda EndRead zwraca liczbę bajtów odczytanych z FileStream, a metoda EndGetHostByName zwraca obiekt IPHostEntry, który zawiera informacje o komputerze hosta. Metoda EndOperationName może przyjmować dowolne parametry out lub ref zadeklarowane w podpisie synchronicznej wersji metody. Oprócz parametrów z metody synchronicznej metoda EndOperationName zawiera również parametr IAsyncResult. Osoby wywołujące muszą przekazać wystąpienie zwrócone przez odpowiednie wywołanie metody BeginOperationName.

Jeśli operacja asynchroniczna reprezentowana przez IAsyncResult obiekt nie została ukończona po EndOperationName wywołaniu, EndOperationName blokuje wątek wywołujący do momentu zakończenia operacji asynchronicznej. Wyjątki generowane przez operację asynchroniczną są zgłaszane z metody EndOperationName. Efekt wielokrotnego wywoływania metody EndOperationName z tym samym parametrem IAsyncResult nie jest zdefiniowany. Podobnie, wywołanie metody EndOperationName z elementem IAsyncResult, który nie został zwrócony przez powiązaną metodę Begin nie jest również zdefiniowane.

Uwaga / Notatka

W przypadku każdego z niezdefiniowanych scenariuszy implementatorzy powinni rozważyć zgłoszenie InvalidOperationException.

Uwaga / Notatka

Implementujący tego wzorca projektowego powinni powiadamiać wywołującego, że operacja asynchroniczna została ukończona przez ustawienie IsCompleted na true, wywołując metodę wywołania zwrotnego asynchronicznego (jeśli została określona) i sygnalizując AsyncWaitHandle.

Deweloperzy aplikacji mają kilka opcji projektowania umożliwiających uzyskanie dostępu do wyników operacji asynchronicznej. Prawidłowy wybór zależy od tego, czy aplikacja ma instrukcje, które mogą być wykonywane podczas wykonywania operacji. Jeśli aplikacja nie może wykonać żadnej dodatkowej pracy, dopóki nie otrzyma wyników operacji asynchronicznej, aplikacja musi się zablokować, dopóki wyniki nie będą dostępne. Aby zablokować operację do momentu zakończenia operacji asynchronicznej, można użyć jednej z następujących metod:

Aplikacje, które nie muszą blokować podczas wykonywania operacji asynchronicznej, mogą używać jednej z następujących metod:

Zobacz także