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. Android 拖动条 和 Handle

  2. 20145206邹京儒 Exp8 Web基础

    20145206邹京儒 Exp8 Web基础 一.实践过程记录 Apache (一)环境配置 1.查看端口占用:在这里apach2占用端口80 2.测试apache是否正常工作:在kali的火狐浏览器 ...

  3. 20145306 网路攻防 web安全基础实践

    20145306 网络攻防 web安全基础实践 实验内容 使用webgoat进行XSS攻击.CSRF攻击.SQL注入 XSS攻击:Stored XSS Attacks.Reflected XSS At ...

  4. 使用node连接MongoDB数据 综本地及linux服务器记

    gitee地址 启动mongo D:\MongoDB> ./bin/mongod --dbpath ./data/db MongoDB 提供了简单的 HTTP 用户界面. 如果你想启用该功能,需 ...

  5. noip 瑞士轮 - 归并

    背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长 ...

  6. sql 之优化小技巧

    SET NOCOUNT ON:不返回计数,如果存储过程中包含一些并不返回实际数据的语句,网络通信流量便会大量减少,可以显著提高应用程序性能:

  7. 论文笔记——DenseNet

    <Densely Connected Convolutional Networks>阅读笔记 代码地址:https://github.com/liuzhuang13/DenseNet 首先 ...

  8. Leetcode ——Partition Equal Subset Sum

    Question Given a non-empty array containing only positive integers, find if the array can be partiti ...

  9. Vue项目中使用Vuex + axios发送请求

    本文是受多篇类似博文的影响写成的,内容也大致相同.无意抄袭,只是为了总结出一份自己的经验. 一直以来,在使用Vue进行开发时,每当涉及到前后端交互都是在每个函数中单独的写代码,这样一来加大了工作量,二 ...

  10. 转:java项目经验面试总结

    转载: 在前期已经讲过怎样分析自己,对自己进行一个准确的定位,选择一个合适的求职方向!并结合自己的实际个人情况来写一份针对性很强的个人简历!个人简历就是个人的广告!好的简历可以更受到用人需求单位青睐! ...