2012-04-01 17 views
8

Kendi kullanımım için bir kitaplık kuruyorum. Belli bir özelliği elde etmek için bir etkinlik beklemek zorundayım. Bunu bir async çağrısı haline getirmeye çalışıyorum.Etkinliği bir uyumsuz çağrıya dönüştürün

Temelde, bu en iyi başarılı olabilir Bu nasıl

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

içine

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

açmak istiyor? Sadece dönüp bekleyebilirim, ancak Monitor.Pulse(), AutoResetEvent veya başka bir şey kullanmak gibi daha iyi bir yol bulmaya çalışıyorum.

cevap

23

TaskCompletionSource'ın devreye alındığı yer. Burada yeni async anahtar kelimesi için çok az yer var. Örnek:

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

    Console.WriteLine(bar); 
} 
+0

(fantezi zaman uyumsuz olan)

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

Numune kullanımı bu işlevi zaman uyumsuz işlevinde sarılmış olabilir sanırım? Ya da sadece işleve async ekleyin ve resultCompletionSource.Task.Result döndürün; hangi beklemesine sebep olur? –

+0

bu bir async fonksiyonu içinde sarılmış, şimdi örnek güncelleme – Polity

+0

Sadece fark ettim, System.Threading.Tasks hedef platform olan Windows Phone 7'de mevcut değil. Alternatif var mı? (bu [http://www.nuget.org/packages/System.Threading.Tasks] 'i bulduk ancak bağımlılıkları en aza indirmek istiyorum) –