近日闲来无事,就做了一个多线程网页访问器,系统主要是完成特定页面的打开,并不显示,主要包括如下部分:
(1)页面请求部分DoPage:
namespace Visits
{
public class DoPage
{
string strURL = string.Empty;//待访问页面地址
public DoPage(string url)
{
this.strURL = url;
}
public void SendRequest()
{
try
{
WebRequest wrt = WebRequest.Create(this.strURL.Trim());
wrt.Credentials = CredentialCache.DefaultCredentials;
WebResponse wrp = wrt.GetResponse();
string content = new StreamReader(wrp.GetResponseStream(), Encoding.Default).ReadToEnd();
content = string.Empty;
}
catch (WebException webEx)
{
//Console.WriteLine(webEx.Message.ToString());
}
}
}
}
(2)线程管理器,主要和进度条进行交互的模块ThreadMethod:
namespace Visits
{
class ThreadMethod
{
int totalcount = 0;
ArrayList DelInstance = new ArrayList();
static ArrayList stObjDelIns = new ArrayList();
static int stCurrentCount = 0;
static private Object lockN = new Object();
//private System.Threading.Thread[] threadlst = new System.Threading.Thread[10];
public ThreadMethod(ArrayList lst)
{
ThreadMethod.stObjDelIns = lst;
}
public ThreadMethod()
{
}
/// <summary>
/// 线程开始事件
/// </summary>
static public event EventHandler threadStartEvent;
/// <summary>
/// 线程执行时事件
/// </summary>
static public event EventHandler threadEvent;
/// <summary>
/// 线程结束事件
/// </summary>
static public event EventHandler threadEndEvent;
static public void Run()
{
int count = ThreadMethod.stObjDelIns.Count;
DoPage dp = null;
threadStartEvent.Invoke(count, new EventArgs());//通知主界面,我开始了,count用来设置进度条的最大值
while (ThreadMethod.stObjDelIns.Count > 0)
{
dp = (DoPage)ThreadMethod.stObjDelIns[0];
//dp.GetPageTask();
dp.SendRequest();
try
{
ThreadMethod.stObjDelIns.RemoveAt(0);
}
catch (Exception ex)
{
//
}
threadEvent.Invoke(ThreadMethod.stCurrentCount + 1, new EventArgs());//通知主界面我正在执行,i表示进度条当前进度
Thread.Sleep(1);
if (ThreadMethod.stObjDelIns.Count == 0)
{
threadEndEvent.Invoke(new object(), new EventArgs());//通知主界面我已经完成了
}
ThreadMethod.stCurrentCount++;
}
}
}
}
(3)form:
public partial class Visits : Form
{
int totalcount = 0;
ArrayList DelInstance = new ArrayList();
private System.Threading.Thread[] threadlst = new System.Threading.Thread[10];
///////////////////////////////////////////////////////////////////////////////////////////////
//线程开始的时候调用的委托
private delegate void maxValueDelegate(int maxValue);
//线程执行中调用的委托
private delegate void nowValueDelegate(int nowValue);
private delegate void msgValueDelegate();
/// <summary>
/// 线程完成事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void method_threadEndEvent(object sender, EventArgs e)
{
CloseThread();
MessageBox.Show("数据处理完成!");
msgValueDelegate msg = new msgValueDelegate(setMsg);
this.Invoke(msg, null);
}
/// <summary>
/// 线程执行中的事件,设置进度条当前进度
/// 但是我不能直接操作进度条,需要一个委托来替我完成
/// </summary>
/// <param name="sender">ThreadMethod函数中传过来的当前值</param>
/// <param name="e"></param>
void method_threadEvent(object sender, EventArgs e)
{
int nowValue = Convert.ToInt32(sender);
nowValueDelegate now = new nowValueDelegate(setNow);
this.Invoke(now, nowValue);
}
/// <summary>
/// 线程开始事件,设置进度条最大值
/// 但是我不能直接操作进度条,需要一个委托来替我完成
/// </summary>
/// <param name="sender">ThreadMethod函数中传过来的最大值</param>
/// <param name="e"></param>
void method_threadStartEvent(object sender, EventArgs e)
{
int maxValue = Convert.ToInt32(sender);
maxValueDelegate max = new maxValueDelegate(setMax);
this.Invoke(max, maxValue);
}
/// <summary>
/// 被委托调用,专门设置进度条最大值的
/// </summary>
/// <param name="maxValue"></param>
private void setMax(int maxValue)
{
this.progressBar1.Maximum = maxValue;
}
/// <summary>
/// 被委托调用,专门设置进度条当前值的
/// </summary>
/// <param name="nowValue"></param>
private void setNow(int nowValue)
{
this.progressBar1.Value = nowValue;
this.lbdecount.Text = nowValue.ToString();
this.lbper.Text = (((float)nowValue / (float)this.totalcount) * 100).ToString("F2") + "%";
}
/// <summary>
/// 被委托调用,专门设置处理结束的报告信息
/// </summary>
private void setMsg()
{
this.lbmsg.Text = "数据处理完成!";
}
///////////////////////////////////////////////////////////////////////////////////////////////
public Visits()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (!tbaddress.Text.Trim().Equals("") && !tbcount.Text.Trim().Equals(""))
{
//启动初始化过程
int count = 0;
try
{
count = Convert.ToInt32(tbcount.Text.Trim());
}
catch (Exception ex)
{
MessageBox.Show("请输入数字!");
tbcount.Text = "50";
return;
}
this.totalcount = count;
this.lbdecount.Text = "0";
this.DelInstance = ConfigPage(this.totalcount);
//定义处理模块
ThreadMethod method = new ThreadMethod(this.DelInstance);
//订阅事件
ThreadMethod.threadStartEvent += new EventHandler(method_threadStartEvent);
ThreadMethod.threadEvent += new EventHandler(method_threadEvent);
ThreadMethod.threadEndEvent += new EventHandler(method_threadEndEvent);
CloseThread();
//初始化线程
for (int t = 0; t < 10; t++)
{
threadlst[t] = new System.Threading.Thread(ThreadMethod.Run);
}
lbmsg.Text = "初始化完成,开始进入处理流程......";
////初始化结束
//启动线程处理数据
for (int i = 0; i < 10; i++)
{
threadlst[i].Start();
}
}
else
{
lbmsg.Text = "请输入网页地址!";
}
}
private ArrayList ConfigPage(int count)
{
if (count < 0) return null;
ArrayList ts = new ArrayList();
for (int i = 0; i < count; i++)
{
DoPage vpage = new DoPage(tbaddress.Text.Trim());
ts.Add(vpage);
}
return ts;
}
private void CloseThread()
{
for (int i = 0; i < 10; i++)
{
if (threadlst[i] != null)
{
if (threadlst[i].IsAlive)
{
threadlst[i].Abort();
}
}
}
}
private void button2_Click(object sender, EventArgs e)
{
CloseThread();
}
}