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 ...
随机推荐
- HTML与CSS入门——第七章 使用表格显示信息
知识点: 1.创建简单表格的方法 2.控制表格大小的方法 3.对齐内容及在表格中跨越行和列的方法 7.1 创建简单的表格: table标签,border控制边框 tr标签,创建表格的行,包含td td ...
- js调用百度地图搜索功能
引用百度jsApi <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&a ...
- Windows下使用ODBC API访问数据库之关键
本文采用SQL2005 + VS2008环境,以ODBC API方式成功连接数据库. 1.SQL安装和环境配置 这部分网上随便搜一下都有很多资料,而且很容易就可以配置成功. 注意的关键点: SA账号配 ...
- 洛谷 P3397 地毯
P3397 地毯 题目背景 此题约为NOIP提高组Day2T1难度. 题目描述 在n*n的格子上有m个地毯. 给出这些地毯的信息,问每个点被多少个地毯覆盖. 输入输出格式 输入格式: 第一行,两个正整 ...
- c++ 编译期计算 (一)
编译期就是编译器进行编译,产生.obj文件的所处的那一段时间(如果是广义的编译期,那么一般还包括了链接期,因为现在很多编译器都会自动调用链接器进行链接)执行期就是你执行某个已经链接好的程序的那段时间. ...
- C语言中对于结构的定义一般放在.h中还是.c中
单文件使用的结构体放.c文件中 本模块内部使用结构体,放模块内部头文件中 供外部使用的结构体,放模块对外头文件中.
- js prototype之诡异
想必经常写js的人必然会经常性的用到prototype这个属性,我写这篇文章倒不是自己对prototype这个属性理解有多深刻,相反是因为自己理解肤浅,想通过写文章来加深理解.废话不多说.下面总结一下 ...
- [转载]移动终端浏览器初始设置apple-mobile-web-app-capable
这两句话的确很有用,有了它,手机访问的时候像样了. 原文地址:移动终端浏览器初始设置apple-mobile-web-app-capable作者:素水凌心 移动终端浏览器默认设置视口的宽度和初始规模. ...
- Linux - create usergroup, user and Assigning permissions
第一步:登录已有的Linux系统,使用root账户,登录好以后,如下图: 这样,就登录到Linux系统中,而且是用root用户登录的 注意:如果,你想要创建用户和用户组,那么你当前登录的用户必须有ro ...
- secure_file_priv 配置项对数据导入导出的影响
secure_file_priv mysqld 用这个配置项来完成对数据导入导出的限制. 例如我们可以通过 select * from tempdb.t into outfile '/home/my ...