//下载时发出的事件
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. Android开发者不可或缺的四大工具

    Android开发者不可或缺的四大工具 android以其极强的开放性吸引着世界各地的开发者去开发各种各样的移动应用开发,而各种SDK更是为各个层次的开发者提供了一个可以尽情展示他们专业技能和创造性的 ...

  2. 配置LNPM

    在 Ubuntu 系统中,可以使用 apt-get 命令来搭建 LNMP环境.这种方式较编译方式安装更加简便,因此选择使用该方式来搭建环境以供学习. 安装Nginx 使用 sudo apt-get i ...

  3. cocos2dx内存优化

    纹理消耗了大量内存 在大部分情况下,是纹理(textures)消耗了游戏程序大量的内存.因此,纹理是我们首要考虑优化的对象 纹理加载 cocos2d里面纹理加载分为两个阶段:从图片文件中创建一个Ima ...

  4. HyperLedger/Fabric SDK使用Docker容器镜像快速部署上线

    HyperLedger/Fabric SDK Docker Image 该项目在github上的地址是:https://github.com/aberic/fabric-sdk-container ( ...

  5. 微软职位内部推荐-SW Engineer II for WinCE

    微软近期Open的职位: Do you have a passion for embedded devices and services? &nbsp Does the following m ...

  6. PAT甲题题解-1104. Sum of Number Segments (20)-(水题)

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

  7. 《Linux内核分析》第二周学习小结 操作系统是如何工作的?

    郝智宇   无转载   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈: 1.计算机是 ...

  8. ElasticSearch 2 (29) - 信息聚合系列之测试驱动

    ElasticSearch 2 (29) - 信息聚合系列之测试驱动 摘要 我们可以用以下几页定义不同的聚合和它们的语法,但学习聚合的最佳途径就是用实例来说明.一旦我们获得了聚合的思想,以及如何合理地 ...

  9. Alpha冲刺第7天

    Alpha第7天 1.团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504 陈顺兴 031602505 张胜男 031602540 廖钰萍 031602323 雷光游 03160 ...

  10. Linux命令(十八) 压缩或解压缩文件和目录 gzip gunzip

    目录 1.命令简介 2.常用参数介绍 3.实例 4.直达底部 命令简介 和 zip 命令类似,gzip 用于文件的压缩,gzip压缩后的文件扩展名为 ".gz",gzip默认压缩后 ...