4

閲覧したページの状態に応じて多くのイベントを発生させることができるカスタム ブラウザー クラスがあります。ここで、ブラウザーを使用してこの Web ページでいくつかの操作を実行する必要がありますが、それらは順次実行する必要があり、各操作には前の操作のデータが必要です。これを実現する最もクリーンな方法は、ブラウザがその仕事をするのを待つ同期メソッドを作成することです。私はこのようにしました:

public incomplete class MyClass {
    // (...) lots of stuff comes here, it's a web browser :)
    public bool MySyncMethod(object data) {
        bool success = false;
        bool wait = true;
        MyEventHandler = new EventHandler((o, e) => {
            data = MyEventProvidedData; // belive me, it's threre when it fired
            success = true; // let's assume it always succeed
            wait = false; // now we can move on to the rest of our long chain
        });
        // (...) here I have some more event handlers which can end my method...
        MyAsyncMethod(data); // so it started and will fire MyEventHandler soon
        while (wait) System.Threading.Thread.Sleep(100);
        return success;
   }
}

しかし、ここで何かがおかしいようです。スレッドを使用する場合、while ループの代わりに myThread.Join() を配置するだけで、スレッドが完了するまで待機します。コントロールによって発生するイベントで使用できる Thread.Join() に似たものですか? while ループの代わりに使用するものはありますか? それは私の目標を達成するためのよりクリーンな方法ですか?上記のコードは実際のアプリでは機能しますが、最適ではないと思います。

また、ここでスレッドを使用しないのには十分な理由があります。スレッドと ActiveX コントロール間のすべての通信はスレッド セーフでなければならず、これを実現するのは簡単ではありません。はい、試してみました :) このコードはデバッグが大変だったので、書き直すことにしました。

4

2 に答える 2

9

ManualResetEvent を使用してみてください:

    var wait = new ManualResetEvent(false); 
    var handler = new EventHandler((o, e) => wait.Set()); 
    MyAsyncMethod(data, handler); // so it started and will fire handler soon 
    wait.WaitOne();
于 2012-06-06T21:12:30.087 に答える
0

タスクを使用できる場合は、WaitAllメソッドを使用できます

しかし、あなたはスレッドを使用できないと言います。それでも、asyncmethodはある種のスレッド化を開始する必要があるので、何らかのスレッド化が必要ですか?アクティブXコントロールが機能するためにasyncmethodが元のスレッドにポストバックする必要があるという問題がある場合は、ASyncOperationManager(恥知らずな独自のブログ投稿リンク:http ://blog.subrosoftware.nl/?p = 42 )を使用できます。またはMSDNリンクそれはおそらくスレッドコールバックの問題を解決できますか?

于 2012-06-06T21:06:04.300 に答える