2012-05-07 38 views
1

でイベントを非同期/ブロッキングコールに変換します(ただし、これは以前のI asked this questionですが、これはWindows Phone 7.1(Mango)のSilverlight 4とC#4で、System.Threading.Tasksawait以上。私は、第三者のライブラリがないネイティブのソリューション、例えばthisのような希望を再度求めています。Windows Phone 7(C#)

私は自分自身でライブラリを使用しています。特定のプロパティを取得するには、イベントを待つ必要があります。イベントはかなり早く発生します。私はそれを阻止的な呼び出しに包み込もうとしています。

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

string GetBarWithWait() 
{ 
    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. 
} 

をオンにしたいですか?

+1

あなたは今のWindows Phone 7用の 'Microsoft.Bcl.Async'をダウンロードすることができます - それはあなたと同じように非同期を可能にし、使用を待ちます期待 – Brendan

答えて

1

あなたはこのような何かを行うことができます。

string GetBarWithWait() 
{ 
    foo = new Foo(); 

    using (var mutex = new ManualResetEvent(false)) 
    { 
     foo.Initialized += (sender, e) => 
     { 
      try 
      { 
       OnFooInit(sender, e); 
      } 
      finally 
      { 
       mutex.Set(); 
      } 
     } 

     foo.Start(); 

     mutex.WaitOne(); 
    } 

    return foo.Bar; 
} 

しかし、あなたはFooのは関係なく、何が起こるかInitializedイベントを呼び出すしないことを絶対的に一定でなければなりません。それ以外の場合は、スレッドを永遠にブロックします。 fooがエラーイベントハンドラのいくつかの種類を持っている場合は、あなたのスレッドをブロックを避けるために、それを購読する:

string GetBarWithWait() 
{ 
    foo = new Foo(); 

    using (var mutex = new ManualResetEvent(false)) 
    { 
     foo.Error += (sender, e) => 
     { 
      // Whatever you want to do when an error happens 
      // Then unblock the thread 
      mutex.Set(); 
     } 

     foo.Initialized += (sender, e) => 
     { 
      try 
      { 
       OnFooInit(sender, e); 
      } 
      finally 
      { 
       mutex.Set(); 
      } 
     } 

     foo.Start(); 

     mutex.WaitOne(); 
    } 

    return foo.Bar; 
} 
+0

ありがとう!それは素晴らしい仕事でした!私は答えとしてマークする前にもう少し待つでしょう。 –

+0

メモ:ReSharperは、 'finally {mutex.Set();の中の"廃止されたアクセスへのアクセス "と言います。 } '。それは間違っているのか..? –

+2

mutexは、 'using'ブロックを離れるときに配置されます。したがって、Fooの 'Initialized'イベントが' GetBarWithWait'メソッドを離れた後に呼び出された場合、例外をスローします。それが起こらないことが分かっている場合は、この警告を無視してかまいません。 –

関連する問題