需要用WebBrowser(需求只能用它)进行重复操作,首先想到的是单独创建一个线程来处理重复操作,但在判断目标页是否加载完毕时就碰到了棘手的问题,代码如下:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;namespace WebBrowserThread
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }        /// <summary>
        /// 启动线程
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            Thread a = new Thread(TProcA);
            //必须的
            a.ApartmentState = ApartmentState.STA;
            a.Start();
        }        /// <summary>
        /// 用于加载完成通知事件对象
        /// </summary>
        private AutoResetEvent aEvent = new AutoResetEvent(false);        /// <summary>
        /// 线程函数A
        /// </summary>
        private void TProcA()
        {
            
            WebBrowser wbs = new WebBrowser();
            wbs.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(MyBrowserDocumentCompletedEventHandler);
            wbs.Navigate("www.baidu.com");
            //等待完成
            aEvent.WaitOne();
            Trace.WriteLine("A nav comp");
        }        /// <summary>
        /// 加载完成事件
        /// </summary>
        private void MyBrowserDocumentCompletedEventHandler(Object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            //通知完成
            if ((sender as WebBrowser).ReadyState == WebBrowserReadyState.Complete)
                aEvent.Set();
        }    }
}代码中在线程里创建了一个WebBrowser对象,通过DocumentComplete事件和一个AutoResetEvent来确定目标页是否加载完毕,但实际结果是线程永远Wait在那了...又用另一种方式,线程函数如下:
        /// <summary>
        /// 线程函数B
        /// </summary>
        private void TProcB()
        {
            WebBrowser wbs = new WebBrowser();
            wbs.Navigate("www.baidu.com");
            
            do{
                Thread.Sleep(500);
            } while (wbs.ReadyState != WebBrowserReadyState.Complete);            Trace.WriteLine("B nav comp");
        }
结果一样无法执行到Trace.WriteLine这一句WebBrowser不能在线程中使用吗?求正解!

解决方案 »

  1.   

    因为aEvent.WaitOne()阻塞了当前线程;导致MyBrowserDocumentCompletedEventHandler 未被触发,
    试试
    while (wbs.ReadyState != WebBrowserReadyState.Complete); 
    {
    Application.DoEvent();
    }
      

  2.   

    这样也不行哦,在我第一段代码里也是用这种方式,感觉WebBrowser不能在线程中才创建,只有在Form里创建然后在线程里Invoke,哪位有不同见解
      

  3.   

    webbrowser的处理是否加载完毕不够完善,如果是在线程中来处理webbrowser要注意线程的安全,你调用的委托实例并没有达到委托的目的,要有个判断,            if (this.InvokeRequired)
                {
                    this.Invoke(new SetForm(this.TProcA));
                }
                else
                {
                   ..// 执行函数
                }