閲覧したページの状態に応じて多くのイベントを発生させることができるカスタム ブラウザー クラスがあります。ここで、ブラウザーを使用してこの 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 コントロール間のすべての通信はスレッド セーフでなければならず、これを実現するのは簡単ではありません。はい、試してみました :) このコードはデバッグが大変だったので、書き直すことにしました。