Event Handler

C# 基础知识系列- 11 委托和事件

僤鯓⒐⒋嵵緔 提交于 2020-04-21 10:06:37
0. 前言 事件和委托是C#中的高级特性,也是C#中很有意思的一部分。出现事件的地方,必然有委托出现;而委托则不一定会有事件出现。那为什么会出现这样的关系呢?这就需要从事件和委托的定义出发,了解其中的内在。 1. 委托 说起委托,就不得不回忆一下之前在Linq篇中介绍的匿名方法,其中提到了Func和Action这两个类型。这两个类型就是委托。 委托在C#中定义为一种面向对象形式的方法寻址方案。简单来讲,就是定义一个类型,然后表示这个类型代表某一种方法。而委托对象,就是方法参数化。委托可以实现将方法当做一个参数传递给另一个方法,也可以认为是反射中的MethodInfo的一种特例(实际上并没有太多关系)。 委托不关心方法叫什么,也不关心方法从哪来(归属于哪个类或者哪个对象),只关心方法需要哪些参数,返回什么类型。 说到这里,我们来看一下如何定义一个委托吧,委托的定义形式如下: delegate <返回类型> 委托名(参数列表);//参数列表代表任意个参数 由之前的定义形式,我们可以知道委托也是一种类型,所以它的定义也符合类型的定义规范。现在我们定义一个没有返回值也没有参数类型的委托作为我们创建的第一个委托: public delegate void FirstDel();// 类型名称是 FirstDel 简单的使用一下: FirstDel del ; del();// 会直接报错

WPF 原生绑定和命令功能使用指南

こ雲淡風輕ζ 提交于 2020-04-18 12:02:53
WPF 原生 绑定 和 命令 功能使用指南 魏刘宏 2020 年 2 月 21 日 如今,当谈到 WPF 时,我们言必称 MVVM、框架(如 Prism)等,似乎已经忘了不用这些的话该怎么使用 WPF 了。当然,这里说的不用框架和 MVVM,并不是说像使用 Winform 那样使用 WPF,而是追本溯源,重识 WPF 与生俱来的 绑定 和 命令 的风采。 一、绑定的使用 目标:前台页面通过绑定获取后台属性的值。 这个目标实际上分为两部分,一是前台获取后台的属性值,二是属性值变动后能够及时体现出来。 要实现目标的第一部分,实际只需在窗体后台的构造函数中添加一行代码即可: this .DataContext = this ; 这行代码很关键,MVVM 模式中页面与 ViewModel 关联也是通过指定页面类的 DataContext 为相应的 ViewModel 对象来实现的。 下面再来说说如何实现目标的第二部分,也就是属性变化后能及时体现出来,包括后台属性变化后前台显示自动变化,以及前台修改了内容,后台属性的值跟着改变。众所周知,这就是绑定,而要实现这一功能,需要相关类实现一个属性变动通知接口 —— InotifyPropertyChanged 。具体演变过程可参考网上的文章《 .NET 4.5 (C#):INotifyPropertyChanged 执行的演变

WPF 原生绑定和命令功能使用指南

匆匆过客 提交于 2020-04-18 11:54:24
WPF 原生 绑定 和 命令 功能使用指南 魏刘宏 2020 年 2 月 21 日 如今,当谈到 WPF 时,我们言必称 MVVM、框架(如 Prism)等,似乎已经忘了不用这些的话该怎么使用 WPF 了。当然,这里说的不用框架和 MVVM,并不是说像使用 Winform 那样使用 WPF,而是追本溯源,重识 WPF 与生俱来的 绑定 和 命令 的风采。 一、绑定的使用 目标:前台页面通过绑定获取后台属性的值。 这个目标实际上分为两部分,一是前台获取后台的属性值,二是属性值变动后能够及时体现出来。 要实现目标的第一部分,实际只需在窗体后台的构造函数中添加一行代码即可: this .DataContext = this ; 这行代码很关键,MVVM 模式中页面与 ViewModel 关联也是通过指定页面类的 DataContext 为相应的 ViewModel 对象来实现的。 下面再来说说如何实现目标的第二部分,也就是属性变化后能及时体现出来,包括后台属性变化后前台显示自动变化,以及前台修改了内容,后台属性的值跟着改变。众所周知,这就是绑定,而要实现这一功能,需要相关类实现一个属性变动通知接口 —— InotifyPropertyChanged 。具体演变过程可参考网上的文章《 .NET 4.5 (C#):INotifyPropertyChanged 执行的演变

事件驱动的微服务-事件驱动设计

血红的双手。 提交于 2020-04-17 17:41:43
本篇是“事件驱动的微服务”系列的第二篇,主要讲述事件驱动设计。如果想要了解总体设计,请看第一篇 "事件驱动的微服务-总体设计" 程序流程 我们通过一个具体的例子来讲解事件驱动设计。 本文中的程序有两个微服务,一个是订单服务(Order Service), 另一个是支付服务(Payment Service)。用户调用订单服务的用例createOrder()来创建订单,创建之后的订单暂时还没有支付信息,订单服务然后发布命令(Command)给支付服务,支付服务完成支付,发送支付完成(Payment Created)消息。订单服务收到消息(Event),在Order表里增加Payment_Id并修改订单状态为“已付款”。 下面就是组件图: 事件处理 事件分成内部事件和外部事件,内部事件是存在于一个微服务内部的事件,不与其他微服务共享。如果用DDD的语言来描述就是在有界上下文(Bounded Context)内的域事件(Domain Event)。外部事件是从一个微服务发布,而被其他微服务接收的事件。如果用DDD的语言来描述就是在不同有界上下文(Bounded Context)之间传送的域事件(Domain Event)。这两种事件的处理方式不同。 内部事件: 对于内部事件的处理早已有了成熟的方法,它的基本思路是创建一个事件总线(Event Bus),由它来监听事件

监听者模式在系统中的应用 —— 事件总线

倾然丶 夕夏残阳落幕 提交于 2020-04-13 21:05:09
【今日推荐】:为什么一到面试就懵逼!>>> 监听者模式 是一种比较常见的设计模式。 在日常的开发中,我们所使用的 事件 就是一种符合 监听者模式 的功能。 对 监听者模式 还不太明白的同学可以通过 WinForm 开发来理解这一概念。 在 WinForm 模式下,事件的使用率是非常高的,窗体中的每一个 Controller 都提供了大量的事件,诸如 Click 、 DoubleClick 、 Load 、 Focus 等等。 为什么会这样设计呢? 因为,当你编写一个与业务无关 控件 的时候,你应当只编写与 显示 相关的代码,以 Button 为例。 编写一个 Button 关心的是如何画出符合尺寸大小的按钮,什么颜色,什么边框,字的位置。至于按下这个按钮需要执行什么,你在编写 Button 还不知道,必须交给 外面 去处理。 所以使用 事件 将点击的信号发送出去,交给外面去处理。 在我们编写业务的时候会用到事件吗? 很少有人会在业务代码中使用 事件 ,一个常见的数据操作流程如下: 前台通过 Http 请求提交数据 通过 WebApi 框架内部的调度,执行某个 Controller 上的某个 Method 开发人员校验提交数据的有效性。可能是通过直接在 Controller 中实现,也可能通过 AOP 等形式实现 将数据交由服务层处理 服务层经一定处理,将数据交由持久层处理

Socket探索1-两种Socket服务端实现

拟墨画扇 提交于 2020-04-13 11:04:39
【今日推荐】:为什么一到面试就懵逼!>>> 介绍 一次简单的Socket探索之旅,分别对Socket服务端的两种方式进行了测试和解析。 CommonSocket 代码实现 实现一个简单的Socket服务,基本功能就是接收消息然后加上结束消息时间返回给客户端。 /// <summary> /// 简单服务,收发消息 /// </summary> class FirstSimpleServer { public static void Run(string m_ip, int m_port) { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); var ip = IPAddress.Parse(m_ip); var endpoint = new IPEndPoint(ip, m_port); socket.Bind(endpoint); socket.Listen(0); socket.ReceiveTimeout = -1; Task.Run(() => { while (true) { var acceptSocket = socket.Accept(); if (acceptSocket != null && acceptSocket

nginx request body读取流程详解

自闭症网瘾萝莉.ら 提交于 2020-04-06 12:47:58
前面的文章中我们分别讲解了nginx是如何读取请求行和请求头数据的,在读取完请求头之后,nginx并不会直接读取请求体,而是直接进入http模块的11个阶段开始处理请求的数据。在这个过程中,如果当前请求匹配的location配置了 proxy_pass ,那么就会在 NGX_HTTP_CONTENT_PHASE 阶段读取客户端发送来的request body数据,以转发给上游服务器。本文主要是对nginx是如何读取客户端的数据进行讲解的。 1. request body读取入口 nginx读取数据是通过 ngx_http_read_client_request_body() 进行的,如下是该方法的源码: /** * 接收http请求的包体 */ ngx_int_t ngx_http_read_client_request_body(ngx_http_request_t *r, ngx_http_client_body_handler_pt post_handler) { size_t preread; ssize_t size; ngx_int_t rc; ngx_buf_t *b; ngx_chain_t out; ngx_http_request_body_t *rb; ngx_http_core_loc_conf_t *clcf; r->main->count++; //

微信小程序内嵌网页web-view

蹲街弑〆低调 提交于 2020-03-02 01:25:25
web-view 组件是一个可以用来承载网页的容器,会自动铺满整个小程序页面。 个人类型与海外类型的小程序暂不支持使用。 客户端 6.7.2 版本开始, navigationStyle: custom 对 <web-view> 组件无效 属性名 类型 默认值 说明 src String webview 指向网页的链接。可打开关联的公众号的文章,其它网页需登录 小程序管理后台 配置业务域名。 bindmessage EventHandler 网页向小程序 postMessage 时,会在特定时机(小程序后退、组件销毁、分享)触发并收到消息。e.detail = { data } bindload EventHandler 网页加载成功时候触发此事件。e.detail = { src } binderror EventHandler 网页加载失败的时候触发此事件。e.detail = { src } 示例代码: <!-- wxml --> <!-- 指向微信公众平台首页的web-view --> <web-view src="https://mp.weixin.qq.com/"></web-view> 相关接口 1 <web-view/> 网页中可使用 JSSDK 1.3.2 提供的接口返回小程序页面。 支持的接口有: 接口名 说明 最低版本 wx.miniProgram

聊聊Elasticsearch的TaskScheduler

佐手、 提交于 2020-02-28 11:52:23
序 本文主要研究一下Elasticsearch的TaskScheduler TaskScheduler elasticsearch-7.0.1/libs/nio/src/main/java/org/elasticsearch/nio/TaskScheduler.java public class TaskScheduler { private final PriorityQueue<DelayedTask> tasks = new PriorityQueue<>(Comparator.comparingLong(DelayedTask::getDeadline)); /** * Schedule a task at the defined relative nanotime. When {@link #pollTask(long)} is called with a * relative nanotime after the scheduled time, the task will be returned. This method returns a * {@link Runnable} that can be run to cancel the scheduled task. * * @param task to schedule * @param relativeNanos

c# web 大文件上传源代码

↘锁芯ラ 提交于 2020-02-27 07:45:45
HTML 部分 <% @ Page Language ="C#" AutoEventWireup ="true" CodeBehind ="index.aspx.cs" Inherits ="up6.index" %> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> < html xmlns ="http://www.w3.org/1999/xhtml" > < head > < meta http-equiv ="Content-Type" content ="text/html; charset=gb2312" /> < title > up6- 多标签演示页面 </ title > < link href ="js/up6.css" type ="text/css" rel ="Stylesheet" charset ="gb2312"/> < script type ="text/javascript" src ="js/jquery-1.4.min.js"></ script > < script type ="text/javascript" src ="js/json2