Z asynchronicznej w synchroniczną

Czasami mamy do dyspozycji tylko asynchroniczne wywołanie interesującej nas metody. Jest tak na przykład w Windows Phone 7 z metodą HttpWebRequest.BeginGetRequestStream(…). Możemy mieć potrzebę wywoływania tej metody synchronicznie. Poniżej kawałeczek kodu, który realizuje to w sposób zgrabny i przejrzysty.

        private void SendRequest(HttpWebRequest httpRequest, byte[] byteData)
        {
            AutoResetEvent autoResetEvent = new AutoResetEvent(false);

            IAsyncResult asyncResult = httpRequest.BeginGetRequestStream(
                r => autoResetEvent.Set(), null);

            // Wait until the call is finished
            autoResetEvent.WaitOne();

            using (Stream requestStream = httpRequest.EndGetRequestStream(asyncResult))
            {
                requestStream.Write(byteData, 0, byteData.Length);
            }
        }

Dla prostoty zakładamy/wiemy, że byteData jest dłuższą tablicą niż potrzeba bajtów do zapisu requestStream.Write(…).

Widziałem różne rozwiązania powyższego problemu. Żadne z nich nie można było nazwać do końca przejrzystym. W prezentowanym rozwiązaniu wszystko zamyka się w jednej funkcji.

EDITED:

Są oczywiste powody wystawienia tylko anynchronicznej metody. Responsywność GUI. Zdarzają się również sytuacje, gdy chcemy mieć tak jak to opisałem. Takim przykładem jest sytuacja, gdy w tle synchronizujemy jakieś dane które muszą przychodzić do nas synchronicznie.

Advertisements
Ten wpis został opublikowany w kategorii Uncategorized i oznaczony tagami , . Dodaj zakładkę do bezpośredniego odnośnika.

Jedna odpowiedź na „Z asynchronicznej w synchroniczną

  1. Pingback: dotnetomaniak.pl

Możliwość komentowania jest wyłączona.