NET中级课--浅谈委托,事件,异步调用,回调等概念
直接说题。
委托
首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类。字段有类型,那么方法其实也有类型,就是委托。
委托是某一类方法的总定义。
事件
事件是某个类用于传递消息的方式。事件之余委托,犹如属性之余变量即是委托的封装。
好了,明确了概念,接下来说示例。
示例
有3个对象 鼠标,button,winform 。鼠标点击button对象,触发button的click事件,winform捕获到了事件然后进行了处理。
含义:button是类,有个click事件,其被点击后,向外部发送了一个消息“我被点击了”,winform说“我来处理”,winform是怎么捕获的呢?连接它们之间的桥梁
其实就是委托。winform通过某一类委托向button的click事件注册自己的方法,当事件发生的时候,方法自然就被调用了。
举个现实中的例子,可能不太恰当。 当我们开车,发生车祸事件时,交警会到现场进行处理,而不是消防或医生或其他人。其实背后就是一个逻辑,预定义好的,车祸是交警处理,火灾是消防处理,生病是医生处理。
接下来说异步调用。
异步调用和回调
顾名思义,异步即不同步,如何体现不同步呢? .net的实现是采用一个新的线程中执行你的方法(不知道理解的对不对:))
为什么要异步呢?简单说winform吧,就是不希望主线程被长时间执行的方法所阻塞,造成不好的用户体验,谁也不希望数据加载时窗体一拉,界面卡死,是吧。
那如何实现异步呢?首先定义委托。你肯定会说为什么? 因为委托类中有begininvoke方法,我猜测begininvoke方法的实现里可能包含了开辟新线程,然后在新线程中执行你的需要异步执行的方法。
好了,方法开始异步执行了。那我怎么知道它执行完了没有啊?使用回调。
你要问了回调是什么玩意啊?回调即回过头来调用,那么是谁回过头?begininvoke开辟的新线程回头调主线程的方法。那目的呢?通知主线程“我执行结束了你看着办”
那么怎么实现呢?我的方法是委托和事件。异步调用的方法在执行完成后触发一个完成的事件,这个事件定义在winform中,谁来处理呢?winform中的方法。
接下来,贴上我的代码。例子比较简单:)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public delegate void ProcessHandler(int i); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //process();主线程直接调用会阻塞 this.button1.Text = "加载中。。。。"; new System.Threading.Thread(new System.Threading.ThreadStart(process)).Start(); this.button1.Text="加载完成"; } private void process() { ; i < ; i++) { System.Threading.Thread.Sleep(); setlist(i); } } private void setlist(int i) { if (this.InvokeRequired) { this.BeginInvoke(new ProcessHandler(setlist), new object[] { i }); return; } this.listBox1.Items.Add(i); } private void button2_Click(object sender, EventArgs e) { MessageBox.Show("sssss"); } private void process(ref bool isfinished) { ; i < ; i++) { System.Threading.Thread.Sleep(); setlist(i); } isfinished = true; finished(ref isfinished); } public delegate void HeadProcess(ref bool isfinish); public event HeadProcess finished; private void button3_Click(object sender, EventArgs e) { this.button3.Text = "加载中。。。。"; bool isfinished = false; this.listBox1.Items.Clear(); HeadProcess hp = new HeadProcess(this.process); IAsyncResult ia = hp.BeginInvoke(ref isfinished, null, null); finished += this.setstatus;//注册完成事件的处理方法 } private void setstatus(ref bool isfinished) { if (this.InvokeRequired) { this.BeginInvoke(new HeadProcess(this.setstatus),new object[]{isfinished}); return; } if (isfinished) { this.button3.Text = "加载完成"; MessageBox.Show("加载完成"); } else { this.button3.Text = "加载失败"; } } } }
第一次写文,比较粗糙,大家凑合看看, 以上解释均为我个人的理解,如有不对,请大家吐槽。:)
NET中级课--浅谈委托,事件,异步调用,回调等概念的更多相关文章
- C#委托的异步调用1
本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...
- C#委托的异步调用
本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...
- C#委托的异步调用【转】
本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...
- [转]C#委托的异步调用
本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...
- 【C#系列】浅谈委托和委托
本篇文章更适合具有一定开发经验,一定功底,且对底层代码有所研究的朋友!!! 本篇文章主要采用理论和代码实例相结合方法来论述委托和事件,涉及到一些边界技术,如软件架构的OCP原则(开-闭原则), 软件架 ...
- C# 浅谈委托----温故而知新
先看看委托的概述: •委托类似于 C++ 函数指针,但它们是类型安全的. • 委托允许将方法作为参数进行传递. • 委托可用于定义回调方法. • 委托可以链接在一起:例如,可以对一个事件调用多个方法. ...
- 浅谈Javascript事件模拟
事件是用来描述网页中某一特定有趣时刻的,众所周知事件通常是在由用户和浏览器进行交互时触发,其实不然,通过Javascript可以在任何时间触发特定的事件,并且这些事件与浏览器创建的事件是相同的.这就意 ...
- c# 委托与异步调用
背景:在winform UI中,有时需要对控件进行比较频繁的刷新,如进度条.picturebox显示视频等.如果在主线程进行这些刷新操作,操作还未完成就将执行下一次刷新,程序将发生错误:如果只是创建另 ...
- ASP.NET 委托,异步调用例子 .
简要介绍:1.定义异步执行需要调用的方法2.定义具有与异步执行方法相同签名的委托(Delegate):3.调用 BeginInvoke 和 EndInvoke 方法. 3.1. BeginInvo ...
随机推荐
- ulimit 参数介绍
Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数 可以用ulimit -a 来显示当前的各种用户进程限制.下面我把某linux用户的最 ...
- DEV GridControl 导出到Excel
SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Title = "导出Excel"; sa ...
- Sass@规则
@importSass 支持所有 CSS3 的 @ 规则, 以及一些 Sass 专属的规则,也被称为“指令(directives)”.Sass 扩展了 CSS 的 @import 规则,让它能够引入 ...
- post请求和get请求的区别
1:如果表单是以post方式发送,那么表单中的数据会放在请求报文体中,发送到服务端.但是如果是以get方式提交表单,那么表单中用户输入的数据都是以URL地址的方式发送到服务端. 2:在服务端接收数据时 ...
- WebApi2官网学习记录---BSON
BSON 是轻量级的,能够进行快速查询和高效的解码/编码.BSON方便查询是由于elements的前面都有一个表示长度的字段,所以解释器可以快速跳过这个elements:高效的解码/编码是因为nume ...
- 第一篇文章-VS的Local DB数据库连接失败,创建实例失败的解决方案
用了很久的LocalDB了,不用装那么多的SQL组件感觉很不错,前不久调试代码碰到一个问题 ,VS突然就连接不上LocalDB了,琢磨了一下午,其实有个很简单的方法. 第一步,先找到SQL Local ...
- Java中关于OOM的场景及解决方法
原文地址:http://developer.51cto.com/art/201112/305696.htm 1.OOM for Heap=>例如:java.lang.OutOfMemoryErr ...
- javascript判断键盘按键
window.document.onkeydown = disableRefresh; function disableRefresh(evt){ evt = (evt) ? evt : window ...
- JSP 核心 (等待更新)
开篇:JSP的等同于servlet 编译器将其转化为.class,后执行.一旦配置在Tomcat webapps,运行访问后,在Tomcat--->work文件内出现java文件,其内容即为转化 ...
- poj3090欧拉函数求和
E - (例题)欧拉函数求和 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:65536KB ...