加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C# – 如何在一段时间内阻止方法返回?

发布时间:2020-12-15 21:10:06 所属栏目:百科 来源:网络整理
导读:我有一个包含Web浏览器控件的win表单应用程序.由于导航的异步性,我需要能够在Web浏览器上的操作之间添加延迟. Document_Complete事件没有价值,因为它没有考虑页面可能包含多个AJAX请求.事件多次发生. UPDATE 加载页面时会生成AJAX请求.因此,通过HTTP请求获取
我有一个包含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

我可以用计时器和BackgroundWorker解决这个问题吗?有人可以提出可行的解决方案吗

解决方法

您可以考虑使用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...");
                }
            }
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读