Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
新线程中的C#计时器_C#_Multithreading_Winforms - Fatal编程技术网

新线程中的C#计时器

新线程中的C#计时器,c#,multithreading,winforms,C#,Multithreading,Winforms,我有一个方法browseWebsite()。webbrowser控件在方法执行时被实例化。不幸的是,打开的网站部分是通过ajax加载的,因此webbrowser控件无法检测到网站加载完成的正确时间,这意味着我无法在加载页面时使用DocumentCompleted事件进一步移动。为了解决这个问题,我实例化了一个System.Windows.Forms.Timer,等待10秒钟,直到他让浏览器在网站上进一步移动。(由于webbrowser与线程一起冻结并停止加载过程,因此线程睡眠不起作用) 整个事情

我有一个方法
browseWebsite()。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个WebRowser在其中点击,从而打乱我的主线程,我想在另一个线程中开始这个过程。不幸的是,当到达方法的最后一行时,线程死亡,并带走webbrowser和计时器。有没有一种方法可以实例化这样的过程?或者让线程保持活动状态?

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

开始在当前线程上运行标准应用程序消息循环,而不使用表单

但请注意,在稍后的某个时刻(处理完成后),您需要调用方法(确保从同一线程调用)

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


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

没有线程!?使用另一个计时器:System.Timers.timer或更好的System.Threading.timer.my bad,更改了Form1_加载事件。线程不会“死亡”-它已完成。还是有例外?您需要在线程内部等待-查看AutoResetEvent或ManualResetEvent。使用另一个计时器。没有例外,它刚刚结束。我研究了一下,但伊万·斯托夫的解决方案非常有效。不过还是要谢谢你:)效果很好!非常感谢你!感谢您指出Thread.IsBackground。这在某个时候会成为一个问题!虽然有效,但我认为这不是一个好的解决方案。除了使用错误的计时器类之外,没有理由再出现另一个消息循环。如何从正确的线程调用Application.ExitThread并不太明显。@Jefferson这不是另一个消息循环。OP创建一个新的STA线程,在其上分配UI组件(
WebBrowser
Timer
),因此它确实需要一个消息循环。另一个(嵌套的)消息循环是当您调用
Application.DoEvents
时。
public void browseWebsite()
{
    // ...
    waitTimer.Start();
    Application.Run();
}