在等待同一行代码时,在主线程webBrowser_DocumentCompleted中保持UI响应

时间:2014-12-03 07:31:37

标签: c# timer webbrowser-control

我想在webBrowser1_DocumentCompleted事件中等一段时间。 原因是当下一个文档完成时,Webbrowser文档流可以很好地下载。 我不想在等待时阻止用户界面,而且我不想让上传的Document_Completed_Events被解雇。

 private void FormTimer()
    {
        webBrowser1.Navigate("http://www.rolex.com/");
        webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
    }
    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        DownloadCount++;
        alarmCounter = 0;
        Task abc = new Task(() =>
        {
            while (alarmCounter < 5)
            {
                Thread.Yield();
            }
        });
        abc.Start();
        Task.WaitAny(abc);
    }

    void timer_Tick(object sender, EventArgs e)
    {
        alarmCounter++;
    }

问题是,当它在DocumentCompletedEvent中时,tick会停止.Kindly帮助我理解问题以及处理这些情况的好方法。

更新 通过分离预期的不需要的事件并使用DoEvents(),这种技术可以工作。它还可以保持UI响应以及计时器滴答。

    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        richTextBox1.Text += "\nDocument Started" + documentCount;
        alarmCounter = 0;
        timer.Enabled = true;
        //Do some work
        webBrowser1.DocumentCompleted -= webBrowser1_DocumentCompleted;
        while (alarmCounter < 3)
        {
            Application.DoEvents();            
        }
        webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;             
        richTextBox1.Text += "\nDocument Completed." + documentCount;
    }

1 个答案:

答案 0 :(得分:1)

您使用的是Windows.Forms.Timer吗?您应该知道,Windows.Forms.Timer在与UI相同的线程中执行什么。所以你调用Task.WaitAny你阻止线程,你的计时器停止工作。