2011-07-07 21 views
5

Mam funkcję, nazwijmy ją Func1 i it contains Func2 & obsługi zdarzeń.Oczekiwanie na zdarzenie do wykonania

Teraz chciałbym uzyskać wartość zwracaną przez funkcję not let (Func1) do momentu uruchomienia Func2 i obsługi zdarzeń.

Zasadniczo Func1 ma łańcuch jako wartość zwrotną, a wartość ciągu jest ustawiana w module obsługi zdarzenia. Muszę więc poczekać, aż zdarzenie zostanie obsłużone, a następnie zwrócić wartość.

Kod Przykład

public static string Fun1() 
    { 
     string stringToReturn = String.Empty; 
     Func2(); //Func2 will after few sec fire event bellow 

     example.MyEvent += (object sender, WebBrowserDocumentCompletedEventArgs e) => 
           { 
            stringToReturn = "example"; //this wont be hardcoded 
           }; 

     //wait for event to be handled and then return value 
     return stringToReturn; 
    } 
+0

Czy Func2 działa na innym wątku niż Func1? –

+0

nie działa na tym samym wątku – Toni

Odpowiedz

8

Można użyć klasy AutoResetEvent. Wywołaj go za pomocą var evt = new AutoResetEvent(false);, zadzwoń pod numer evt.WaitOne(), gdzie chcesz poczekać, i evt.Set();, gdzie chcesz zasygnalizować, że kod oczekujący może być kontynuowany.

Jeśli masz wiele sytuacji "oczekiwania do", które dotyczą zdarzeń, możesz także zajrzeć do Reactive Extensions (Rx).

+0

Szczerze mówiąc nie udało mi się go pomyślnie wdrożyć. Po dodaniu go do kodu Finc1 nigdy nie dojdziesz do linii, która zwraca wartość: – Toni

+0

@Toni: Gdzie wprowadziłeś wywołania 'evt.WaitOne()' i 'evt.Set()'? Czy jesteś pewien, że wywołasz obie metody na tym samym wystąpieniu 'AutoResetEvent' (to jest kluczowe)? –

+0

Jestem (przynajmniej tak myślę) spróbuję przykładu z MSND na osobnym projekcie i sprawdzę, co się dzieje – Toni

1

Czy nie wystarczy prosty semafor?

public static string Fun1() 
{ 
    Semaphore sem = new Semaphore(1,1); 

    string stringToReturn = String.Empty; 
    Func2(); //Func2 will after few sec fire event bellow 

    example.MyEvent += (object sender, WebBrowserDocumentCompletedEventArgs e) => 
          { 
           stringToReturn = "example"; //this wont be hardcoded 
           sem.Release(); 
          }; 
    sem.WaitOne(); 

    //wait for event to be handled and then return value 
    return stringToReturn; 
} 
0

Jako Func2 działa na tej samej nici za Func1, Func1 nie powróci przed Func2 zwrotu. Oznacza to, że jest gwarantowane, że zdarzenie uruchomione w Func2 zostanie wywołane przed zwróceniem kontroli do Func1. Po prostu podłącz swój program obsługi zdarzeń przed wywołaniem Func2 i powinien działać zgodnie z oczekiwaniami.

Korzystanie z Semaphore lub AutoResetEvent jest przesadą w tym scenariuszu, ponieważ oba uzyskują zasoby systemu operacyjnego do zarządzania synchronizacją wątków.