//下载时发出的事件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DownloadHandler
{
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(); } //Main
class Program
{
static void Main(string[] args)
{
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 + "%"); }
}
}

c#的事件用法——实现下载时发生的事件的更多相关文章

  1. JS的Touch事件们,触屏时的js事件

    丫的,终于找到了JS在平板电脑上的事件!!!   iphone.ipod Touch.ipad触屏时的js事件   1.Touch事件简介   pc上的web页面鼠标会产生onmousedown.on ...

  2. [转]jQuery 双击事件(dblclick)时,不触发单击事件(click)

    例1: 链接:http://www.w3school.com.cn/jquery/event_dblclick.asp HTML 系列教程 浏览器脚本 服务器脚本 ASP.NET 教程 XML 系列教 ...

  3. javascript中的常用表单事件用法

    下面介绍几种javascript中常用的表单事件: 一,onsubmit:表单中的确认按钮被点击时发生的事件,如下案例. 案例解析:弹出表单中提交的内容 <form name="tes ...

  4. input单选框多选框时可用的事件

    change(): 当元素的值发生改变时,会发生 change 事件. 该事件仅适用于文本域(text field),以及 textarea 和 select 元素. change() 函数触发 ch ...

  5. JavaScript事件基础-10-2.HTML事件; DOM0级事件; 掌握常用的鼠标与键盘事件 ; 掌握this的指向;

    JavaScript事件基础 学习目标 1.掌握什么是事件 2.掌握HTML事件 3.掌握DOM0级事件 4.掌握常用的鼠标与键盘事件 5.掌握this的指向 什么是事件 事件就是文档或浏览器窗口中发 ...

  6. onkeyup 事件会在键盘按键被松开时发生

    定义和用法 onkeyup 事件会在键盘按键被松开时发生. 语法 onkeyup="SomeJavaScriptCode" 参数 描述 SomeJavaScriptCode 必需. ...

  7. [C# 基础知识系列]专题五:当点击按钮时触发Click事件背后发生的事情 (转载)

    当我们在点击窗口中的Button控件VS会帮我们自动生成一些代码,我们只需要在Click方法中写一些自己的代码就可以实现触发Click事件后我们Click方法中代码就会执行,然而我一直有一个疑问的—— ...

  8. keyup([[data],fn]) 当按钮被松开时,发生 keyup 事件。它发生在当前获得焦点的元素上。

    keyup([[data],fn]) 概述 当按钮被松开时,发生 keyup 事件.它发生在当前获得焦点的元素上. 注释:如果在文档元素上进行设置,则无论元素是否获得焦点,该事件都会发生.直线电机选型 ...

  9. keydown([[data],fn]) 当键盘或按钮被按下时,发生 keydown 事件。

    keydown([[data],fn]) 概述 当键盘或按钮被按下时,发生 keydown 事件. 注释:如果在文档元素上进行设置,则无论元素是否获得焦点,该事件都会发生.直线电机滑台 参数 fnFu ...

随机推荐

  1. 面向对象第一次练手-------ArrayList集合、类、对象、冒泡排序、类型转换

    思维转不过弯儿来  怎么做都是错      哪怕差一个()就成功的事情,也是千差万别 忽然想到一句话:差一步就成功的距离  =  差几万米就成功的距离 部分的理解和都体现在代码和注释里 using S ...

  2. DFA化简

    首先是未化简DFA的转换表 NFA状态 DFA状态 a b {0,1,2,4,7} A B C {1,2,3,4,6,7,8} B B D {1,2,4,5,6,7} C B C {1,2,4,5,6 ...

  3. Python列表知识点讲解

    增删改查 增 X.append函数是在原有列表中的末尾追加一个新的元素存放在列表中 X.extend() 将一个列表中的元素添加到另一个列表中,将所引用的原列表保持不变,同时extend还可以运用到, ...

  4. Linux使用expect实现免手动密码输入,linux免密码登陆

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理.  脚本代码如下:  ###### ...

  5. FASIC: A Fast-recovery, Adaptively Spanning In-band Control Plane in Software-Defined Network

    2017 IEEE Global Communications Conference 问题:in-band网络中如果物理链路阻塞或者硬件故障,导致控制器的消息不能及时到达各个交换机导致网络不一致甚至某 ...

  6. 通俗易懂的word2Vec负采样理解

    理解:http://www.shuang0420.com/2017/03/21/NLP%20%E7%AC%94%E8%AE%B0%20-%20%E5%86%8D%E8%B0%88%E8%AF%8D%E ...

  7. VS2013快速安装教程

    1.下载vs2013安装镜像.VS2013_RTM_ULT_CHS.iso链接: http://pan.baidu.com/s/1mguOdiK密码: rllz  建议使用百度网盘客户端下载,虽然被人 ...

  8. vsphere web client 使用中文的解决办法

    1. 很多网站这么说的: vsphere web client的默认URL为:https://hostname:9443/vsphere-client 可以在URL后面加上一个参数来指定区域语言 英语 ...

  9. [From WIKI] IBM Z

    IBM zEnterprise System From Wikipedia, the free encyclopedia     Jump to navigationJump to search Hi ...

  10. MyBatis传入多个参数的问题(转)

    一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...