2012-04-01 23 views
8

Sto avvolgendo una libreria per mio uso personale. Per ottenere una certa proprietà ho bisogno di aspettare un evento. Sto cercando di avvolgerlo in una chiamata asincrona.Trasforma l'evento in una chiamata asincrona

Fondamentalmente, voglio girare

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

In questa

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; 
} 

Come può essere meglio realizzato? Potrei semplicemente fare un ciclo e aspettare, ma sto cercando di trovare un modo migliore come usare Monitor.Pulse(), AutoResetEvent o qualcos'altro.

risposta

23

Ecco dove entra in gioco TaskCompletionSource. C'è poco spazio per la nuova parola chiave async qui. Esempio:

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 del campione (con fantasia asincrona)

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

    Console.WriteLine(bar); 
} 
+0

Credo che questa funzione potrebbe essere avvolto in una funzione asincrona? Oppure aggiungi semplicemente async alla funzione e restituisci resultCompletionSource.Task.Result; quale farebbe aspettare? –

+0

questo può essere avvolto in una funzione asincrona, aggiornando l'esempio ora – Polity

+0

Appena notato, System.Threading.Tasks non è disponibile su Windows Phone 7, che è la mia piattaforma di destinazione. C'è un'alternativa? (ho trovato [questo] (http://www.nuget.org/packages/System.Threading.Tasks) ma vorrei ridurre al minimo le dipendenze) –

Problemi correlati