using System;
using System.Threading;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
namespace ThreadPoolDelegate
{
//public delegate void ReceiveCompletedEventHandler(string url,string title,string sourcecode);
public delegate void ReceiveCompletedEventHandler(object sender,ReceiveCompletedEventArgs e);
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class Class1
{
public event ReceiveCompletedEventHandler ReceiveCompletedEvent;
public Class1()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public void ReadSourceCode(object o)
{
string url = (string)o;
string title = "";
string sourcecode = "";
WebClient wc = new WebClient();
byte[] data = wc.DownloadData(url);
sourcecode = Encoding.Default.GetString(data);
title = this.GetPageTitle(sourcecode);
if (ReceiveCompletedEvent != null)
{
//ReceiveCompletedEvent(url,title,sourcecode);
ReceiveCompletedEvent(this,new ReceiveCompletedEventArgs(url,title,sourcecode));
}
}
public void ReadSourceCode(object o,bool timeout)
{
string url = (string)o;
string title = "";
string sourcecode = "";
WebClient wc = new WebClient();
byte[] data = wc.DownloadData(url);
sourcecode = Encoding.Default.GetString(data);
title = this.GetPageTitle(sourcecode);
if (ReceiveCompletedEvent != null)
{
//ReceiveCompletedEvent(url,title,sourcecode);
ReceiveCompletedEvent(this,new ReceiveCompletedEventArgs(url,title,sourcecode));
}
}
private string GetPageTitle(string str)
{
string lTitle = "";
string lPattern = "(?:<\\s*title\\s*>(?<t>[^<]+))";
Regex rx = new Regex(lPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled );
Match mt = rx.Match(str);
if ( mt.Success )
try
{
lTitle = mt.Groups["t"].Value.ToString();
}
catch
{
lTitle ="";
}
else
lTitle = "";
return lTitle;
}
}
public class test
{
static ManualResetEvent ev = new ManualResetEvent(false);
private static int intCount;
private static DateTime dtStart = DateTime.Now;
public static void Main(string[] args)
{
Class1 c = new Class1();
c.ReceiveCompletedEvent += new ReceiveCompletedEventHandler(WriteOut);
if (args.Length >=1)
{
for (int i=0;i<args.Length;i++)
{
//ThreadPool.QueueUserWorkItem(new WaitCallback(c.ReadSourceCode),args[i]);
ThreadPool.RegisterWaitForSingleObject(ev,new WaitOrTimerCallback(c.ReadSourceCode),args[i],3000,true);
intCount++;
}
ev.WaitOne();
}
else
{
Console.WriteLine("you must pass an argument at least ");
}
}
private static void WriteOut(object sender,ReceiveCompletedEventArgs e)
{
try
{
intCount--;
Console.WriteLine("正在执行......{0}",e.URL);
FileStream fs = new FileStream(@"c:\"+e.Title+".txt",FileMode.Create,FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(e.URL);
sw.WriteLine();
sw.WriteLine(e.Title);
sw.WriteLine();
sw.WriteLine(e.SourceCode);
sw.WriteLine();
sw.Flush();
fs.Flush();
sw.Close();
fs.Close();
Console.WriteLine("执行完成......{0}",e.URL);
if(intCount == 0)
{
Console.WriteLine("程序执行完成.....");
TimeSpan tsSpent = DateTime.Now.Subtract(dtStart);
Console.WriteLine("程序执行时间......{0}毫秒",tsSpent.TotalMilliseconds);
Console.WriteLine("程序在退出之前等待5秒,only for demo");
Thread.Sleep(5000);
ev.Set();
}
}
catch(Exception ex)
{
throw new Exception(ex.Message);
}
}
/*
private static void WriteOut(string url,string title,string sourcecode)
{
intCount--;
FileStream fs = new FileStream(@"c:\"+title+".txt",FileMode.Create,FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(url);
sw.WriteLine();
sw.WriteLine(title);
sw.WriteLine();
sw.WriteLine(sourcecode);
sw.WriteLine();
sw.Flush();
fs.Flush();
sw.Close();
fs.Close();
Console.WriteLine("执行完成......{0}",e.URL);
if(intCount == 0)
{
Console.WriteLine("程序执行完成.....");
TimeSpan tsSpent = DateTime.Now.Subtract(dtStart);
Console.WriteLine("程序执行时间......{0}毫秒",tsSpent.TotalMilliseconds);
Console.WriteLine("程序在退出之前等待10秒,only for demo");
Thread.Sleep(10000);
ev.Set();
}
}
*/
}
public class ReceiveCompletedEventArgs : System.EventArgs
{
string _url;
string _title;
string _sourcecode;
public string URL
{
get
{
return _url;
}
}
public string Title
{
get
{
return _title;
}
}
public string SourceCode
{
get
{
return _sourcecode;
}
}
public ReceiveCompletedEventArgs(string url,string title,string sourcecode)
{
this._url = url;
this._title = title;
this._sourcecode = sourcecode;
}
}
}
这里定义了两种委托的方式,大家随便看看
|
|