//下载时发出的事件
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. Asp.Net_HttpModule的应用

    IHttpModule向实现类提供模块初始化和处置事件. IHttpModule包含兩個方法: public void Init(HttpApplication context);public voi ...

  2. vsftp在防火墙开启需要开放的端口

    1.开放tcp端口 firewall-cmd --zone=public --add-port=20/tcp --permanent firewall-cmd --zone=public --add- ...

  3. Serverless架构详解:开发者如何专注于业务代码本身?

    本文来自腾讯云技术沙龙,本次沙龙主题为Serverless架构开发与SCF部署实践 演讲嘉宾:黄文俊,曾负责企业级存储.企业级容器平台等产品的架构与开发,目前主要负责SCF腾讯无服务器云函数产品相关. ...

  4. package.json 中 npm 依赖包版本前的符号的意义

    版本的格式 major.minor.patch:主版本号.次版本号.修补版本号 patch:修复bug,兼容老版本 minor:新增功能,兼容老版本 major:新增功能,不兼容老版本 version ...

  5. PAT甲题题解-1078. Hashing (25)-hash散列

    二次方探测解决冲突一开始理解错了,难怪一直WA.先寻找key%TSize的index处,如果冲突,那么依此寻找(key+j*j)%TSize的位置,j=1~TSize-1如果都没有空位,则输出'-' ...

  6. 第一个spring,第一天。

    陈志棚:界面跳转与框架 李天麟:游戏界面ui 徐侃:算法代码的设计 经过热烈的讨论后,我们各自在完成自己的任务.

  7. A-Softmax的总结及与L-Softmax的对比——SphereFace

    A-Softmax的总结及与L-Softmax的对比--SphereFace \(\quad\)[引言]SphereFace在MegaFace数据集上识别率在2017年排名第一,用的A-Softmax ...

  8. Supervised Hashing with Kernels, KSH

    Notation 该论文中应用到较多符号,为避免混淆,在此进行解释: n:原始数据集的大小 l:实验中用于监督学习的数据集大小(矩阵S行/列的大小) m:辅助数据集,用于得到基于核的哈希函数 r:比特 ...

  9. 3D开机动画

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  10. es6 对象的扩展

    一.现在还有很多浏览器不能直接使用es6语法.特别是手机端的一些低版本的浏览器.都需要用bale转换一下. 但是目前流行的框架中(vue,react,angular).都有自己的脚手架,都能用webp ...