【问题标题】:I want to know how to control the flow of code when using webbrowser?我想知道在使用 webbrowser 时如何控制代码流?
【发布时间】:2011-07-03 13:47:20
【问题描述】:

我有一个循环,我在循环中调用

   webbrowser.navigate("www.example.com");

在此之后,您知道调用了 documentcompleted 函数,并且我在该函数中做了一些工作,但是在所有工作完成之后,没有任何事情发生,代码不会像在循环中那样返回循环并流动。我是做错事了。

谢谢

【问题讨论】:

    标签: c# winforms visual-studio-2010 webbrowser-control


    【解决方案1】:

    这个问题是由一个循环引起的。 Web 浏览器的导航只能完成,并且 DocumentCompleted 事件只能在您的 UI 线程再次空闲时触发。这是多线程组件工作方式的核心,当 UI 线程空闲并泵送消息循环时,它们只能在 UI 线程上触发“工作完成”事件。例如,BackgroundWorker 类具有完全相同的要求。

    解决它的正确方法是创建一个状态机。您可以通过告诉浏览器导航到第一个 url 来启动它。您让 DocumentCompleted 事件处理程序处理响应,然后告诉浏览器导航到下一个 url。或者在没有更多要处理的 URL 时停止。

    不正确的方法是在循环中调用 Application.DoEvents()。这会泵送消息循环并允许事件触发。但这是一件非常危险的事情,DoEvents() 对处理 what 事件没有选择性。如果您打算使用它,请务必阅读this answer

    下一个方法是即将在下一版本的 C# 中支持 async 和 await 关键字。目前可用in CTP

    【讨论】:

    • 你没听懂他的问题?
    【解决方案2】:

    当您离开网页时,您的 javascript 通过导航离开,这类似于关闭您的应用程序并启动其他应用程序。

    如果你有一个你写过的桌面应用程序:

    Application.ExitAndStartOtherApplication("SomeOtherApplication.exe");
    

    您不会期望该行之后的任何代码都会运行。

    都是一样的。

    【讨论】:

    • hmm 那么有什么帮助或想法吗?只要给我指出正确的方向,我就会弄清楚其余的。
    • 如果您控制着其他网站,您可以在“documentcompleted 函数”中的 javascript 完成后导航返回到原始页面。使用 cookie 或在查询字符串中传递一些字符串来维护您的状态。不过听起来有点疯狂
    • 我正在使用桌面应用程序,我也在想类似的事情,当我们在代码中调用另一个进程时,等待,当进程退出时从下一行开始,
    • notions.okuda.ca/2009/06/11/… 查看名为“从 JavaScript 调用 C#”的部分
    • 你不明白我的意思,史蒂夫,我在想当我们到达导航行时,一个新线程打开运行代码然后退出,然后我前进一个多线程环境可以实现在这里。有什么意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多