using System; public delegate void DownloadStartHandler(object sender, DownloadStartEventArgs e); //声明委托 public delegate void DownloadEndHandler(object sender, DownloadEndEventArgs e); public delegate void DownloadingHandler(object sender, DownloadingEventArgs e); public class DownloadStartEventArgs { public string Url{ get{ return _url;} set{ _url=value;} } private string _url; public DownloadStartEventArgs( string url ){ this._url = url; } } public class DownloadEndEventArgs { public string Url{ get{ return _url;} set{ _url=value;} } private string _url; public long ByteCount { get { return _byteCount; } set{ _byteCount=value;} } private long _byteCount; public DownloadEndEventArgs( string url, long size ){ this._url = url; this._byteCount=size; } } public class DownloadingEventArgs { public string Url{ get{ return _url;} set{ _url=value;} } private string _url; public double Percent { get { return _percent; } set{ _percent=value;} } private double _percent; public DownloadingEventArgs( string url, double percent ){ this._url = url; this._percent=percent; } } public class Crawler { public event DownloadStartHandler DownloadStart; // 声明事件 public event DownloadEndHandler DownloadEnd; // 声明事件 public event DownloadingHandler Downloading; // 声明事件 public string Name { get{return name;} set{ name=value;} } private string name; private string site; public Crawler( string name, string site ) { this.name = name; this.site = site; } public void Craw() { while( true ) { string url = GetNextUrl(); if( url == null ) break; long size = GetSizeOfUrl( url ); if( DownloadStart != null ) //下载开始的事件发生 { DownloadStart( this, new DownloadStartEventArgs(url)); } for( long i=0; i<size+1024; i+=1024 ) { //下载数据。。。 System.Threading.Thread.Sleep( 100 ); double percent = (int)(i*100.0/size); if( percent>100) percent=100; if( Downloading != null ) //下载数据的事件发生 { Downloading( this, new DownloadingEventArgs(url, percent)); } } if( DownloadEnd != null ) //下载结束的事件发生 { DownloadEnd( this, new DownloadEndEventArgs(url, size)); } } } private string GetNextUrl() { int a = rnd.Next(10); if( a == 0 ) return null; return site + "/Page" + a + ".htm"; } private long GetSizeOfUrl( string url) { return rnd.Next(3000 * url.Length); } private Random rnd = new Random(); } class Test { static void Main() { Crawler crawler = new Crawler("Crawer101", "http://www.pku.edu.cn"); crawler.DownloadStart += new DownloadStartHandler( ShowStart ); //注册事件 crawler.DownloadEnd += new DownloadEndHandler( ShowEnd ); crawler.Downloading += new DownloadingHandler( ShowPercent ); crawler.Craw(); } static void ShowStart(object sender, DownloadStartEventArgs e){ Console.WriteLine( (sender as Crawler).Name + "开始下载" + e.Url ); } static void ShowEnd(object sender, DownloadEndEventArgs e){ Console.WriteLine( "\n\r下载" + e.Url + "结束,其下载" + e.ByteCount + "字节" ); } static void ShowPercent(object sender, DownloadingEventArgs e){ Console.Write( "\r下载" + e.Url + "......." + e.Percent + "%" ); } }
If opportunity doesn’t knock, build a door