需要用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不能在线程中使用吗?求正解!
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不能在线程中使用吗?求正解!
试试
while (wbs.ReadyState != WebBrowserReadyState.Complete);
{
Application.DoEvent();
}
{
this.Invoke(new SetForm(this.TProcA));
}
else
{
..// 执行函数
}