C# 事件

news2024/11/24 17:59:09

一 C#中的事件

大致上:事件-----回调函数;

二 用户界面中的事件

① 按钮点击事件
② 基本的写法

this.button1.Click+=new System.EventHandler(this.button1_Click);
private void button1_Click(object sender,EventHandler e)
{
    this.label1.Text=DateTime.Now.ToString();
}

三 事件

1 事件的声明

public event 委托名 事件名;

2 事件的注册与移除

事件名+= 或 -=
在事件所在类的外面,只能用以上两个运算符

3 事件的发生(激发)

事件名(参数列表)
相当于回调所注册的函数;

实例
网络爬虫

EventWhenDownload.cs

4 定义及使用事件的6步

1) 公用的

① 声明事件参数类:class xxxEventArgs{}
② 声明委托:delegate void xxxEventhandler(obj,args);

3) 在一个类中

① 定义事件:public event类型 名称;
② 发生事件:事件名(参数);

3) 在别的类中

① 定义一个方法:void方法名(obj,args);
② 注册事件:xxx.事件+=new 委托(方法名);
在这里插入图片描述

5 事件与委托的关系

事件有点像委托类型的实例
事件一定有相关的委托类型;
与委托实例一样,事件也“包含”多个函数;
事件的运算受更多限制(在类外只能用+=或-=)

事件比委托实例更复杂:
可以定义事件存取器
修饰符event委托类型名 事件名
{
add{e+=value;}
remove{e-=value;}
}

总结:
事件时一种消息机制;
事件源调用事件,别的类注册事件;
事件的类型是一个委托;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 下载时发出事件
{
    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; } }
        public 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 = GetNexUrl();
                if (url == null) break;
                long size = GetSizeOfUrl(url);

                if (DownloadStart != null)//下载开始的事件发送
                {
                    DownloadStart(this, new DownloadStartEventArgs(url));
                }

                for (long i = 0; i < size + 1024; i += 1024)
                {
                    //下载数据
                    System.Threading.Thread.Sleep(100);
                    double percent = (int)(i * 100.0 / size);
                    if (percent > 100) percent = 100;

                    if (Downloading != null)//下载数据的事件发送
                    {
                        Downloading(this, new DownloadingEventArgs(url, percent));
                    }
                }
            }
        }
        private string GetNexUrl()
        {
            int a = rnd.Next(10);
            if (a == 0) return null;
            return site + "/Page" + a + ".htm";
        }

        private long GetSizeOfUrl(string url)
        {
            return rnd.Next(3000 * url.Length);
        }
        private Random rnd = new Random();
    }

    class Test
    {
        static void Main()
        {
            CrawLer crawler = new CrawLer("Crawer101", "https://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("\n下载" + e.Url + ".........." + e.Percent + "%");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++智能指针weak_ptr

C智能指针weak_ptr 学习路线&#xff1a;C智能指针shared_ptr->C智能指针unique_ptr->C智能指针weak_ptr 简介&#xff1a;本文讲解常用的智能指针的用法和原理&#xff0c;包括shared_ptr,unique_ptr,weak_ptr。 概述 weak_ptr设计的目的是为配合 shared_ptr 而引入…

静电场方程与边界面上的衔接条件 工程电磁学 P6

我们现在已经知道两个公式 我们可以得到微分形式 对于体密度&#xff0c;面密度&#xff0c;线密度&#xff0c;点电荷的理解 很多同学会问空间中为什么要有面密度&#xff0c;线密度的存在呢&#xff1f; 其实这个是模型的需要&#xff0c;因为介质不一定是连续的&#xff0…

如何设计一个高性能的图 Schema

本文整理自青藤云安全工程师——文洲在青藤云技术团队内部分享&#xff0c;分享视频参考&#xff1a;https://www.bilibili.com/video/BV1r64y1R72i 图数据库的性能和 schema 的设计息息相关&#xff0c;但是 NebulaGraph 官方本身对图 schema 的设计其实没有一个定论&#xff…

Codeforces Round #837 (Div. 2) C. Hossam and Trainees

Problem - C - Codeforces 翻译&#xff1a; 胡萨姆有&#x1d45b;名学员。他给&#x1d456;-th的学员分配了一个号码&#x1d44e;&#x1d456;。 一双&#x1d456;-th和&#x1d457;-th(&#x1d456;≠&#x1d457;)学员被称为成功的如果有一个整数&#x1d465;(&…

基于springboot的企业员工工资管理系统(财务系统)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

Vue渲染器(二):挂载与更新

渲染器&#xff08;二&#xff09;&#xff1a;挂载与更新 前面介绍了渲染器的基本概念和整体框架&#xff0c;接下来就可以介绍渲染器的核心功能&#xff1a;挂载与更新。 1.挂载子节点和元素的属性&#xff1a; vnode.children的值为字符串类型时&#xff0c;会把它设置为…

019 | 在线电影娱乐网站系统设计含论文 | 大学生毕业设计 | 极致技术工厂

作为一个在线电影娱乐网站系统&#xff0c;它展示给浏览者的是各种电影信息&#xff0c;把这些信息能够按用户的需要友好的展示出来是很重要的&#xff0c;同时&#xff0c;能够实现对这些信息的有条不紊的管理也是不可以忽视的。对浏览者和会员的功能而言叫做前台实现&#xf…

[附源码]Node.js计算机毕业设计电子购物商城Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

[附源码]计算机毕业设计电商小程序Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

【GRU时序预测】基于卷积神经网络结合门控循环单元CNN-GRU实现时间序列预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

代码随想录训练营第49天|LeetCode 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

参考 代码随想录 题目一&#xff1a;LeetCode 121. 买卖股票的最佳时机 注意这个题只买卖一次&#xff01;&#xff01; 贪心 class Solution { public:int maxProfit(vector<int>& prices) {int low INT_MAX;int result 0;for(int i 0; i < prices.size(…

Redis框架(十):大众点评项目 订单功能 Redis实现全局唯一ID、 秒杀基本环境

大众点评项目 订单功能 秒杀基本环境需求&#xff1a;订单功能 秒杀基本环境Redis实现全局唯一ID业务实现代码总览总结SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将会回顾Redis实战项目 大众点评 主要依照以下几个原则 基础实战的Dem…

揭秘!全球2022年Salesforce不同招聘职位的平均薪资

Salesforce可以说是发展最快的企业软件公司。此外&#xff0c;还一直被评选为全球最佳工作场所之一&#xff0c;2021年赢得了Glassdoor评选的最佳工作场所&#xff0c;并且在《财富》杂志的100家最佳工作公司中排名第四。除了非常重视员工福利&#xff0c;强调工作与生活的平衡…

在WSL中配置GPU环境

首先需要明确一点&#xff0c;虽然我们通过安装WSL获得了linux开发环境&#xff0c;但是我们最终使用的GPU还是在windows当中的&#xff0c;所以还是需要在系统中安装对应的驱动。 第一步&#xff1a;在window上根据显卡型号和版本安装驱动 这里参考之前的步骤就行 第二步&a…

HPC走出全新路线:《开放架构HPC技术与生态白皮书》注解

文|智能相对论 作者|叶远风 数字经济大时代&#xff0c;创新驱动大环境&#xff0c;HPC已不再是阳春白雪&#xff0c;而受到越来越多人的关注。 HPC&#xff0c;即High Performance Computing&#xff0c;高性能计算。对普通人来说&#xff0c;没有听过HPC&#xff0c;但肯定…

使用docker-compose搭建mysql主从复制

使用docker-compose搭建mysql主从复制&#xff1a; Mysql的主从【快速】搭建编写脚本编写 master.sh 脚本编写 slave.sh 脚本编写docker-compose.yml文本测试阶段主从同步效果主从环境重启容器被删除&#xff0c;重新启动从节点关闭&#xff0c;主节点继续写入数据从节点删除&a…

[附源码]计算机毕业设计的云网盘设计Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

阻塞队列BlockingQueue与同步队列SynchronousQueue

阻塞队列&#xff08;BlockingQueue&#xff09; 什么情况下我们会使用阻塞队列&#xff1f; 多线程并发处理&#xff0c;线程池&#xff01; 使用队列 添加 移除 BlockingQueue四组API 方式有返回值&#xff0c;抛出异常 有返回值&#xff0c;不抛出异常 阻塞等待 超时等待 …

Kubelet v1.25.x源码——StatusManager

1. 环境说明 Kubernetes源码版本&#xff1a;remotes/origin/release-1.25 Kubernetes编译出来的Kubelet版本&#xff1a;Kubernetes v1.24.0-beta.0.2463ee7799bab469d7 Kubernetes集群实验环境&#xff1a;使用Kubernetes v1.25.4二进制的方式搭建了一个单节点集群 K8S 单节…

Linux redhat8.0 NFS共享目录

简介&#xff1a; NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS&#xff0c;用户和程序可以像访问本地文件一样访问远端系统上的文件。 作用&#xff1a; 多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。 员工都可以操作…