2011-07-07 14 views
5

Tengo una función, llamémosla Func1 y it contains Func2 & controlador de eventos.Esperando que se maneje el evento

Ahora lo que me gustaría lograr es not let función (Func1) devolver valor hasta Func2 dispara y maneja el evento.

Básicamente Func1 tiene cadena como valor de retorno y el valor de cadena se establece dentro del controlador de eventos. Entonces necesito esperar a que se maneje el evento y luego devolver el valor.

Código Ejemplo

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

Func2 ejecuta en otro hilo que Func1? –

+0

no funciona en el mismo hilo – Toni

Respuesta

8

Usted podría utilizar la clase AutoResetEvent. Crea una instancia con var evt = new AutoResetEvent(false);, llama al evt.WaitOne() donde quieras esperar, y evt.Set(); donde quieras indicar que el código de espera puede continuar.

Si tiene muchas situaciones de "espera hasta" que involucren eventos, también puede consultar Reactive Extensions (Rx).

+0

Para ser sincero, no logré implementarlo con éxito. Después de agregarlo al código Finc1 nunca llegar a la línea que devuelve el valor – Toni

+0

@Toni: ¿Dónde pusiste las llamadas a 'evt.WaitOne()' y 'evt.Set()'? ¿Estás seguro de llamar a ambos métodos en la misma instancia de 'AutoResetEvent' (esto es crucial)? –

+0

Estoy (al menos eso creo) Voy a probar el ejemplo de MSND en un proyecto separado y ver qué está pasando – Toni

1

¿No bastaría un simple semáforo?

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

Como Func2 se ejecuta en la misma rosca que Func1, Func1 no volverán antes Func2 devoluciones. Esto significa que está garantizado que el evento disparado en Func2 es despedido antes de devolver el control al Func1. Simplemente adjunte su controlador de eventos antes de llamar al Func2 y debería funcionar como se esperaba.

El uso de Semaphore o AutoResetEvent es exagerado en este escenario ya que ambos adquieren recursos del SO para administrar la sincronización de subprocesos.

Cuestiones relacionadas