【发布时间】:2016-02-03 21:28:23
【问题描述】:
令我非常不满的是,我需要在我的一个应用程序中使用 WebBrowser 控件。
我还需要做的一件事是等待元素变为可见/类更改/等,这在DocumentCompleted 事件被触发后发生,在我的情况下使该事件几乎无用。
所以目前我有类似...
while (webBrowser.Document?.GetElementById("id")?.GetAttribute("classname") != "class")
{
Application.DoEvents();
Thread.Sleep(1);
}
现在我在多个地方读到DoEvents() 是邪恶的并且会导致很多问题,所以我考虑用Task.Delay() 替换它:
while (webBrowser.Document?.GetElementById("id")?.GetAttribute("classname") != "class")
{
await Task.Delay(10);
}
所以我的问题是,除了Thread.Sleep() 将阻止事件1ms 并且Task.Delay() 在上面的示例中设置了更大的延迟这一明显事实之外,执行这两种方法之间的实际区别是什么,哪个更好,为什么?
PS:请坚持这个问题,虽然我不一定介意关于如何通过使用其他东西来解决WebBrowser控制问题本身的其他想法(想到js注入),这不是回答这个问题的地方,这个问题是关于这两位代码的不同之处以及哪个会更好。
【问题讨论】:
-
这里有很多不使用 DoEvents() 的理由:stackoverflow.com/a/11352575/80274
-
另外,您是否查看过this SO post 或许
DocumentCompleted没有提前触发,而是多次触发,而您只是听错了。 -
@ScottChamberlain 我已经阅读了您粘贴的两个链接。关于
DocumentCompleted的那个并不完全适用于我(是的,它确实触发了多次,不幸的是,每次触发时 URL 总是相同的,即使在最后一次触发之后,元素仍然不是我想要的状态它是)。至于DoEvents()的危害,是的,已经阅读并理解了,但我的问题是Task.Delay()与它有何不同。换句话说,它是否可能遭受与DoEvents()相同的警告?它的工作方式有何不同?
标签: c# multithreading async-await task doevents