2012-04-01 15 views
8

Estoy envolviendo una biblioteca para mi propio uso. Para obtener cierta propiedad, necesito esperar un evento. Estoy tratando de incluir eso en una llamada asíncrona.Convierta el evento en una llamada asíncrona

Básicamente, quiero convertir

void Prepare() 
{ 
    foo = new Foo(); 
    foo.Initialized += OnFooInit; 
    foo.Start(); 
} 
string Bar 
{ 
    return foo.Bar; // Only available after OnFooInit has been called. 
} 

En este

async string GetBarAsync() 
{ 
    foo = new Foo(); 
    foo.Initialized += OnFooInit; 
    foo.Start(); 
    // Wait for OnFooInit to be called and run, but don't know how 
    return foo.Bar; 
} 

¿Cómo pudo conseguirse mejor? Podría simplemente hacer un bucle y esperar, pero estoy tratando de encontrar una manera mejor, como usar Monitor.Pulse(), AutoResetEvent u otra cosa.

Respuesta

23

Aquí es donde TaskCompletionSource entra en juego. Aquí hay poco espacio para la nueva palabra clave asíncrona. Ejemplo:

Task<string> GetBarAsync() 
{ 
    TaskCompletionSource<string> resultCompletionSource = new TaskCompletionSource<string>(); 

    foo = new Foo(); 
    foo.Initialized += OnFooInit; 
    foo.Initialized += delegate 
    { 
     resultCompletionSource.SetResult(foo.Bar); 
    }; 
    foo.Start(); 

    return resultCompletionSource.Task; 
} 

uso de la muestra (con async suposición)

async void PrintBar() 
{ 
    // we can use await here since bar returns a Task of string 
    string bar = await GetBarAsync(); 

    Console.WriteLine(bar); 
} 
+0

supongo esta función podría ser envuelto en una función asíncrona? O simplemente agregue la función asincrónica a la función y devuelva resultCompletionSource.Task.Result; que lo haría esperar? –

+0

esto se puede envolver en una función asíncrona, actualizando la muestra ahora – Polity

+0

Recién notado, System.Threading.Tasks no está disponible en Windows Phone 7, que es mi plataforma de destino. ¿Hay una alternativa? (he encontrado [esto] (http://www.nuget.org/packages/System.Threading.Tasks) pero me gustaría minimizar las dependencias) –

Cuestiones relacionadas