gpt4 book ai didi

C# 如何让同步方法等待事件触发?

转载 作者:太空狗 更新时间:2023-10-30 00:26:28 24 4
gpt4 key购买 nike

我有自定义浏览器类,它能够根据浏览的页面状态触发大量事件。现在我需要使用我的浏览器在这个网页上执行一些操作,但它们必须顺序运行,每个操作都需要前一个操作的数据。实现这一点的最干净的方法是创建一个等待浏览器完成其工作的同步方法。我是这样做的:

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

但是这里似乎有些不对劲。如果我使用线程,我只需放置 myThread.Join() 而不是我的 while 循环,它会等待我的线程完成。它是否类似于可以与控件触发的事件一起使用的 Thread.Join()?有什么东西可以用来代替 while 循环吗?这是实现我的目标的更清洁的方法吗?上面的代码在实际应用中有效,但我认为它不是最佳的。

我在这里不使用线程是有充分理由的 - 线程和 ActiveX 控件之间的所有通信都必须是线程安全的,而这并非易事。是的,我试过了:)这段代码很难调试,所以我决定重写它。

最佳答案

尝试使用 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();

关于C# 如何让同步方法等待事件触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10922163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com