Model programowania asynchronicznego (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 FileStream klasa udostępnia BeginRead metody i EndRead do asynchronicznego odczytywania bajtów z pliku. Te metody implementują asynchroniczną wersję Read metody .

Uwaga

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 Asynchronous Pattern (TAP)).

Po wywołaniu BeginOperationNamewywołania 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 BeginOperationNamemetody aplikacja powinna również wywołać EndOperationName metodę , 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.

Element członkowski 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 używanym do wywołania BeginOperationName zamiast wykonywania w osobnym ThreadPool wątku.
IsCompleted Wartość wskazująca, czy operacja asynchroniczna została ukończona.

Metoda BeginOperationName przyjmuje wszystkie parametry zadeklarowane w podpisie synchronicznej wersji metody, która jest przekazywana przez wartość lub przez odwołanie. Wszystkie parametry out nie są częścią BeginOperationName podpisu metody. Podpis BeginOperationName metody zawiera również dwa dodatkowe parametry. Pierwszy z nich definiuje AsyncCallback delegata, który odwołuje się do metody wywoływanej po zakończeniu operacji asynchronicznej. Obiekt wywołujący może określić null (Nothing w Visual Basic), jeśli nie ma metody wywoływanej 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 zwraca kontrolkę do wątek wywołujący natychmiast. 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 EndRead metoda zwraca liczbę bajtów odczytanych z klasy , FileStream a EndGetHostByName metoda zwraca IPHostEntry obiekt zawierający informacje o komputerze hosta. Metoda EndOperationName pobiera wszystkie parametry out lub ref zadeklarowane w podpisie synchronicznej wersji metody. Oprócz parametrów z metody EndOperationName synchronicznej metoda zawiera IAsyncResult również parametr . 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 zgłaszane przez operację asynchroniczną są zgłaszane z EndOperationName metody . Efekt wielokrotnego EndOperationName wywoływania metody z tą samą wartością IAsyncResult nie jest zdefiniowany. Podobnie wywołanie EndOperationName metody z elementem IAsyncResult , które nie zostało zwrócone przez powiązaną metodę Begin, również nie jest zdefiniowane.

Uwaga

W przypadku jednego z niezdefiniowanych scenariuszy implementacje powinny rozważyć zgłoszenie .InvalidOperationException

Uwaga

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

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 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 też