繁体   English   中英

新线程中的 C# 计时器

[英]C# timer within new thread

我有一个方法browseWebsite()使用 webbrowser 控件浏览网站以自动更改该网站内的数据。 当方法被执行时,webbrowser 控件被实例化。 不幸的是,打开的网站部分是通过 ajax 加载的,因此 webbrowser 控件无法检测到网站加载完成的正确时间,这意味着我无法在加载页面时使用DocumentCompleted事件进一步移动。 为了解决这个问题,我实例化了一个System.Windows.Forms.Timer以等待 10 秒,直到他让浏览器在网站上进一步移动。 (线程睡眠不起作用,因为 webbrowser 与线程一起冻结并停止加载过程)整个过程如下所示:

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread thread = new Thread(() => browseWebsite());
            thread.SetApartmentState(ApartmentState.STA);

            thread.Start();

        }

        public void browseWebsite()
        {
            WebBrowser browser = new WebBrowser();

            browser.Navigate("somesite");
        Timer waitTimer = new Timer();
        waitTimer.Interval = 10000;
        waitTimer.Tick +=  delegate (object sender, EventArgs e) { WaitTimer_Tick(sender, e, browser); };

        waitTimer.Start();
    }

    private void WaitTimer_Tick(object sender, EventArgs e, WebBrowser browser)
    {
        browser.Navigate("somewhere else");
    }

由于此方法执行的完整过程非常长且复杂,而且我不想弄乱我的主线程,其中有 50 个浏览器在其中单击,因此我想在另一个线程中启动该过程。 不幸的是,当到达该方法的最后一行时,该线程将死亡,并带走了 webbrowser 和计时器。 有没有办法实例化这样的过程? 或者保持线程活着?

您可以使用无参数Application.Run方法重载

开始在当前线程上运行标准应用程序消息循环,没有表单。

public void browseWebsite()
{
    // ...
    waitTimer.Start();
    Application.Run();
}

但请注意,稍后(完成处理后),您需要调用Application.ExitThread方法(确保从同一线程调用它)

退出当前线程上的消息循环并关闭该线程上的所有窗口。

最后,没有直接关系,但是在使用此类线程时,最好将Thread.IsBackground设置为true ,以免在主线程(主应用程序线程)终止时阻止您的应用进程终止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM