我有一个包含Web浏览器控件的win表单应用程序.由于导航的异步性,我需要能够在Web浏览器上的操作之间添加延迟.
Document_Complete事件没有价值,因为它没有考虑页面可能包含多个AJAX请求.事件多次发生.
UPDATE
加载页面时会生成AJAX请求.因此,通过HTTP请求获取页面加载和某些DIV中的内容.因此,Document_Complete事件在文档首次加载时引发,然后在每个(AJAX)HTTP请求返回时引发.没有布埃诺.
UPDATE2
我的应用程序尝试从Webbrowser.Document对象中读取HtmlElements.因为代码执行速度比HTTP请求返回的速度快…文档对象不包含所有html元素.
我需要的是一些延迟主线程中方法调用的方法.我尝试过使用计时器:
private void startTimer() { timer.Interval = 2000; timer.Start(); while (!browserIsReady) { //Wait for timer } }
这会锁定线程并且tick事件永远不会触发.这个循环永远不会结束
我想运行一系列这样的方法:
Navagate("http://someurl.com"); //delay ClickALink(); //delay Navagate("Http://somewhere.com"); //delay
解决方法
您可以考虑使用Threading命名空间中的Monitor类.以下示例.
using System; using System.Threading; namespace MonitorWait { class Program { private static readonly object somelock = new object(); static void Main(string[] args) { ThreadPool.QueueUserWorkItem(new WaitCallback(SyncCall)); Thread.Sleep(5000); //Give the SyncCall a chance to run... //Thread.Sleep(6000); //Uncomment to see it timeout. lock (somelock) { Monitor.pulse(somelock); //Tell the SyncCall it can wake up... } Thread.Sleep(1000); //Pause the main thread so the other thread //prints before this one :) Console.WriteLine("Press the any key..."); Console.ReadKey(); } private static void SyncCall(object o) { lock (somelock) { Console.WriteLine("Waiting with a 10 second timeout..."); bool ret = Monitor.Wait(somelock,10000); if (ret) { Console.WriteLine("pulsed..."); } else { Console.WriteLine("Timed out..."); } } } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。