1

(私は以前にこの質問System.Threading.Tasksをしましたが、いくつかの制約について言及するのを忘れていました。これは、Silverlight4とC#4を備えたWindows Phone 7.1(Mango)用awaitです。このようなパーティライブラリ。)

私は自分で使用するためにライブラリをラップしています。特定のプロパティを取得するには、イベントを待つ必要があります。イベントは非常に速く発生します。私はそれをブロッキング呼び出しにラップしようとしています。

基本的には向きを変えたい

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

これに

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

これを最もよく達成するにはどうすればよいでしょうか。

4

1 に答える 1

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

Initializedただし、何が起こっても Foo がイベントを呼び出すことを絶対に確認する必要があります。そうしないと、スレッドが永久にブロックされます。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;
}
于 2012-05-07T14:52:46.693 に答える