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=; i<size+; i+= )
{
//下载数据。。。
System.Threading.Thread.Sleep( );
double percent = (int)(i*100.0/size);
if( percent>) percent=; 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();
if( a == ) return null;
return site + "/Page" + a + ".htm";
}
private long GetSizeOfUrl( string url)
{
return rnd.Next( * 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 + "%" ); } }

4.2 event的更多相关文章

  1. 如何利用ETW(Event Tracing for Windows)记录日志

    ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统.由于采用内核(Kernel)层面的缓冲和日志记录机制,所以ETW提供了一种非常高效的事 ...

  2. [.NET] C# 知识回顾 - Event 事件

    C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...

  3. Atitit 解决Unhandled event loop exception错误的办法

    Atitit 解决Unhandled event loop exception错误的办法 查看workspace/.metadata/.log org.eclipse.swt.SWTError: No ...

  4. Java模拟Windows的Event

    场景 开发中遇到一个场景,业务操作会不定时的产生工作任务,这些工作任务需要放入到一个队列中,而另外会有一个线程一直检测这个队列,队列中有任务就从队列中取出并进行运算. 问题 业务场景倒是简单,只不过这 ...

  5. 事件EVENT与waitforsingleobject的使用

    事件event与waitforsingleobject的配合使用,能够解决很多同步问题,也可以在数据达到某个状态时启动另一个线程的执行,如报警. event的几个函数: 1.CreateEvent和O ...

  6. 火狐浏览器中event不起作用解决办法--记录(一)

    今天遇到了这个问题.IE,谷歌下都没问题,但在FF下却不起作用,很郁闷查了半天,看别人博文写了老长,结果试了要么起作用,但太麻烦,要么不起作用,说了那么多跟没说一样. 其实只要这一句代码就行:e=ar ...

  7. Event事件

    妙味课堂-Event事件 1.焦点:当一个元素有焦点的时候,那么他就可以接受用户的输入(不是所有元素都能接受焦点) 给元素设置焦点的方式: 1.点击 2.tab 3.js 2.(例子:输入框提示文字) ...

  8. Event Sourcing Pattern 事件源模式

    Use an append-only store to record the full series of events that describe actions taken on data in ...

  9. 严重: Exception sending context initialized event to listener instance of class

    问题描述:Exception sending context initialized event to listener instance of class org.springframework.w ...

  10. [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

    原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委 ...

随机推荐

  1. Contiki源码+原理+功能+编程+移植+驱动+网络(转)

    源:Contiki源码+原理+功能+编程+移植+驱动+网络 请链接:http://www.rimelink.com/nd.jsp? id=31&_np=105_315 假设您对于用Contik ...

  2. gcc5.2版本安装详解

    gcc5.2版本安装详解 1.下载gcc-5.2安装包 gcc各版本浏览地址:http://ftp.gnu.org/gnu/gcc/gcc-5.2浏览地址:http://ftp.gnu.org/gnu ...

  3. jQuery 对象

    jQuery 对象 版权声明:未经博主授权,严禁转载分享 什么是 jQuery 对象 jQuery 对象是通过 jQuery 包装 DOM 对象后产生的对象. jQuery 对象是一个类数组对象. j ...

  4. bootstrap6 关于bs的使用总结

    在同一行中也可以有多个过了行的 "行", 即列的"总宽度"超宽度12. 即实现堆叠display:block和水平排列float的自动控制, 在div的clas ...

  5. POJ1144 Network(割点)题解

    Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are c ...

  6. c#进阶之Delegate

    委托是什么?答:委托是一种类型   等同与 一个class类,继承System.MulticastDelegate,但mult....gate是一个特殊类,不能够派生 委托的调用,如何去使用 1/委托 ...

  7. ASP.NET MVC之Bundle压缩JS和CSS

    介绍Bundle之前先引用<淘宝技术这十年>中一段话,对Web前端稍微有点常识的人都应该知道,浏览器下一步会加载页面中用到的CSS.JS(JavaScript).图片等样式.脚本和资源文件 ...

  8. Java filter中的chain.doFilter详解

    转载: 一.chain.doFilter作用 1.一般filter都是一个链,web.xml 里面配置了几个就有几个.一个一个的连在一起 request -> filter1 -> fil ...

  9. 【TCP/IP详解 卷一:协议】第十一章 UDP 用户数据报协议

    11.1 引言 UDP 是一个简单的 面向数据报 的运输层协议:进程的每个 输出操作 都正好产生一个 UDP数据报,并且组装成一份待发送的IP数据报. 这与 TCP 不一样,它是 面向流字符 的协议, ...

  10. LCA在线算法详解

    LCA(最近公共祖先)的求法有多种,这里先介绍第一种:在线算法. 声明一下:下面的内容参考了http://www.cnblogs.com/scau20110726/archive/2013/05/26 ...