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 BeginOperationName
wywoł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 BeginOperationName
metody 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:
Wywołaj wywołanie
EndOperationName
z głównego wątku aplikacji, blokując wykonywanie aplikacji do momentu zakończenia operacji. Aby zapoznać się z przykładem tej techniki, zobacz Blokowanie wykonywania aplikacji przez zakończenie operacji asynchronicznych.Użyj polecenia , AsyncWaitHandle aby zablokować wykonywanie aplikacji do czasu ukończenia co najmniej jednej operacji. Aby zapoznać się z przykładem tej techniki, zobacz Blokowanie wykonywania aplikacji przy użyciu AsyncWaitHandle.
Aplikacje, które nie muszą blokować podczas wykonywania operacji asynchronicznej, mogą używać jednej z następujących metod:
Sonduj stan ukończenia operacji, okresowo sprawdzając IsCompleted właściwość i wywołując
EndOperationName
po zakończeniu operacji. Aby zapoznać się z przykładem tej techniki, zobacz Sondowanie stanu operacji asynchronicznej.Użyj delegata AsyncCallback , aby określić metodę, która ma zostać wywołana po zakończeniu operacji. Aby zapoznać się z przykładem tej techniki, zobacz Using an AsyncCallback Delegate to End an Asynchronous Operation (Używanie delegata AsyncCallback do zakończenia operacji asynchronicznej).