图解C#_事件
概述
今天用来演示事件的例子是模拟实现一个文件下载类,在这个类中我将定义一个DownLoad事件,这个事件用来在文件下载的过程中,向订阅这个事件的用户发出消息,而这个消息将用DownLoadEventArgs类来封装,这个消息类中定义一个percent字段,用来保存当前已下载文件的百分比,下面请看官欣赏过程:
一、定义要发送给用户(订阅事件者)的消息类
internal class DownLoadEventArgs: EventArgs
{
private readonly Int32 _percent; //文件下载百分比
public DownLoadEventArgs(Int32 percent)
{
_percent = percent;
} public Int32 Percent
{
get
{
return _percent;
}
}
}
二、定义文件下载类
这个类中定义一个DownLoad事件,一个当事件发生时通知用户(事件订阅者)的方法OnFileDownloaded,一个文件下载方法FileDownload,如下:
internal class FileManager
{
public event EventHandler<DownLoadEventArgs> DownLoad; //定义事件 protected virtual void OnFileDownloaded(DownLoadEventArgs e)
{
EventHandler<DownLoadEventArgs> temp = DownLoad;
if(temp != null)
{
temp(this, e);
}
} public void FileDownload(string url)
{
int percent = ;
while(percent <= )
{
//模拟下载文件
++percent;
DownLoadEventArgs e = new DownLoadEventArgs(percent);
OnFileDownloaded(e); //事件触发,向订阅者发送消息(下载百分比的值) Thread.Sleep();
}
}
}
三、客户端订阅事件
在客户端实例化文件下载类,然后绑定事件,如下:
class Program
{
static void Main(string[] args)
{
FileManager manager = new FileManager();
manager.DownLoad += Manager_DownLoad; //订阅事件
manager.FileDownload("http://asdfwqerqasdfs.zip"); //下载文件
} /// <summary>
/// 接到事件通知后要执行的方法
/// </summary>
/// <param name="sender">事件触发对象</param>
/// <param name="e">事件发送过来的消息(百分比)</param>
private static void Manager_DownLoad(object sender, DownLoadEventArgs e)
{
Console.WriteLine(string.Format("文件已下载:{0}%", e.Percent.ToString()));
}
}
四、显示结果

五、图示

六、个人理解
其实事件就是用将一系列订阅方法绑定在一个委托上,当方法执行时,触发到该事件时,就会按通知绑定在委托上的方法去执行。
总结
写博客不容易,尤其是对我这样的c#新人,如果大家觉得写的还好,请推荐或打赏支持,我会更加努力写文章的。

图解C#_事件的更多相关文章
- C#_事件
C#_事件 概述 今天用来演示事件的例子是模拟实现一个文件下载类,在这个类中我将定义一个DownLoad事件,这个事件用来在文件下载的过程中,向订阅这个事件的用户发出消息,而这个消息将用DownLoa ...
- DotNetCore跨平台~服务总线_事件总线的重新设计
理论闲话 之前在.netFramework平台用的好好的,可升级到.net core平台之后,由于不再需要二进制序列化,导致咱们的事件机制遇到了问题,之前大叔的事件一直是将处理程序序列化后进行存储的, ...
- 图解Android触摸事件分发
Android中触摸事件传递过程中最重要的是dispatchTouchEvent().onInterceptTouchEvent()和onTouchEvent()方法. View和Activity有d ...
- 第9章 用内核对象进行线程同步(1)_事件对象(Event)
9.1 等待函数 (1)WaitForSingleObject(hObject,dwMilliseonds); ①dwMilliseconds为INFINITE时表示无限等待 ②dwMilliseco ...
- C#_事件委托
CarDealer类 事件发布程序 using System; using System.Collections.Generic; using System.Linq; using System.Te ...
- C#_串口程序_二次打包_事件响应
using System;using System.IO.Ports;using System.Windows.Forms; namespace Dll_Serial_Comm{ public ...
- jQuery_第五章_事件和动画
Jquery中的事件与动画 一.window.onload和$(document).read()的细微差别 (1)执行时机 window.onload:所有元素(包括元素的所有关联文件)完全加载到浏览 ...
- jquery父元素和子元素点击事件传递问题_不可把父元素的事件传递给子元素_事件无限循环传递
前述:jquery中: 当一个元素的点击事件被触发时,会自动将该事件向父级元素逐级专递. 但是实际场景当中,我们可能会遇到需要在父级元素中定义点击事件,来触发特定子元素的点击事件,我就遇到了这么一个问 ...
- (92)Wangdao.com_第二十五天_线程机制_H5 Web Workers 分线程任务_事件 Event
浏览器内核 支撑浏览器运行的最核心的程序 IE 浏览器内核 Trident内核,也是俗称的IE内核Chrome 浏览器内核 统称为 Chromium 内核或 ...
随机推荐
- Java数据类型BooleanDemo
- css基础(二)
一.元素内容的字体属性 1.font-family 字体名称,例如:宋体,新罗马字体等 注意:1.不能使用偏僻的字体,要使用安全字体,如:arial;verdana;times new roman ...
- 【JavaScript】==与===对比
1.对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等 2)同类型比较,直接进 ...
- c,c++,java格式总结
c语言 java
- Codeforces Round #316 (Div. 2A) 570A Elections
题目:Click here #include <bits/stdc++.h> using namespace std; typedef long long ll; const int IN ...
- android:music
package com.terry; import java.io.File; import java.io.FileFilter; import java.io.IOException; impor ...
- Java--对象内存布局
在HotSpot虚拟机中,对象在内存中的存储布局可以分为3块区域:对象头部.实例数据.对齐填充. 一.对象头部Header的布局 Mark Word Class 指针 在32位系统下,上面两部分各占4 ...
- Chapter 7 代理模式
代理模式:为其它对象提供一种代理以控制对这个对象的访问. 代码: package xiao; class Girl{ private String name; public void setName( ...
- Net::OpenSSH 使用例子
[root@dr-mysql01 mojo]# cat a1.pl use Net::OpenSSH; my $host = '121.4xx.xx1.41'; my $user = 'root'; ...
- 基于visual Studio2013解决算法导论之045斐波那契堆
题目 斐波那契堆 解决代码及点评 // 斐波那契堆.cpp : 定义控制台应用程序的入口点. // #include<iostream> #include<cstdio> ...