我有一个定制的浏览器类,可以根据浏览页面状态触发许多事件。现在,我需要使用我的浏览器对这个网页执行一些操作,但是它们必须按顺序运行,每个操作都需要前一个操作的数据。
实现这个最清晰的方式是创建一个同步方法来等待浏览器完成其工作。我像这样实现:
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 控件之间的通信必须是线程安全的,而这并不容易实现。是的,我尝试过 :) 这段代码非常难以调试,所以我决定重写它。