2012-04-01 14 views
8

私は自分でライブラリをラッピングしています。特定のプロパティを取得するには、私はイベントを待つ必要があります。私は非同期呼び出しにそれをラップしようとしています。イベントを非同期呼び出しに変換

基本的に、私はこれが最善達成することができるどのようにこの

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

中に、

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

をオンにしたいですか?私はちょうどループして待つことができますが、Monitor.Pulse()、AutoResetEventなどを使用するなど、より良い方法を見つけようとしています。

答えて

23

TaskCompletionSourceが出場するThats。新しい非同期キーワードの余地はほとんどありません。例:(ファンシー非同期付き)

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

サンプル使用

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

    Console.WriteLine(bar); 
} 
+0

私は、この関数は非同期関数でラップすることができたと思いますか?または、関数にasyncを追加し、resultCompletionSource.Task.Resultを返します。それはそれを待たせるだろうか? –

+0

これは非同期関数でラップして今すぐサンプルを更新する – Polity

+0

ターゲットプラットフォームであるWindows Phone 7ではSystem.Threading.Tasksを使用できません。代わりがありますか? ([this](http://www.nuget.org/packages/System.Threading.Tasks)が見つかりましたが、私は依存関係を最小限に抑えたい) –

関連する問題