直接说题。

委托

        首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类。字段有类型,那么方法其实也有类型,就是委托。

      委托是某一类方法的总定义。

   事件

          事件是某个类用于传递消息的方式。事件之余委托,犹如属性之余变量即是委托的封装。

    好了,明确了概念,接下来说示例。

   示例

        有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中级课--浅谈委托,事件,异步调用,回调等概念的更多相关文章

  1. C#委托的异步调用1

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  2. C#委托的异步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  3. C#委托的异步调用【转】

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

  4. [转]C#委托的异步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

  5. 【C#系列】浅谈委托和委托

    本篇文章更适合具有一定开发经验,一定功底,且对底层代码有所研究的朋友!!! 本篇文章主要采用理论和代码实例相结合方法来论述委托和事件,涉及到一些边界技术,如软件架构的OCP原则(开-闭原则), 软件架 ...

  6. C# 浅谈委托----温故而知新

    先看看委托的概述: •委托类似于 C++ 函数指针,但它们是类型安全的. • 委托允许将方法作为参数进行传递. • 委托可用于定义回调方法. • 委托可以链接在一起:例如,可以对一个事件调用多个方法. ...

  7. 浅谈Javascript事件模拟

    事件是用来描述网页中某一特定有趣时刻的,众所周知事件通常是在由用户和浏览器进行交互时触发,其实不然,通过Javascript可以在任何时间触发特定的事件,并且这些事件与浏览器创建的事件是相同的.这就意 ...

  8. c# 委托与异步调用

    背景:在winform UI中,有时需要对控件进行比较频繁的刷新,如进度条.picturebox显示视频等.如果在主线程进行这些刷新操作,操作还未完成就将执行下一次刷新,程序将发生错误:如果只是创建另 ...

  9. ASP.NET 委托,异步调用例子 .

    简要介绍:1.定义异步执行需要调用的方法2.定义具有与异步执行方法相同签名的委托(Delegate):3.调用 BeginInvoke 和 EndInvoke 方法.   3.1. BeginInvo ...

随机推荐

  1. razor类型强制转换

    一.如果后台得到的是一个List类型 1.后台得到数组数据 var dutyList = IOCFactory.R<IEmployeeContract>().BatchFind(m =&g ...

  2. windows同一台电脑设置多个公钥与不同github帐号交互

    1 生成公钥 1. 安装git,从C:\Documents and Settings\Administrator\.ssh\目录打开 "Git Bash":2. 键入命令:ssh- ...

  3. VS2015打开工程文件卡死

    今天偶然遇到VS2015打开某个工程文件卡死,一直等待无响应: 关闭VS,打开另外一个工程文件是正常的: 开始怀疑是工程文件有问题,用VS2013打开是正常的,排除工程文件问题: 删除对应工程文件下的 ...

  4. UC浏览器 分享到朋友圈和微信好友

    用手机UC浏览器访问新浪微博,会注意到有这样的两个分享按钮: 在手机端浏览器里,点击分享按钮,就可以启动微信客户端并分享到微信.研究了下其源代码,存在这样的一个js:http://mjs.sinaim ...

  5. Struts2.3.16.3 基本9个jar包

    实践证明,Struts2.3.16.3 至少要下面9个Jar包才能正常启动. commons-fileupload-1.3.1.jar commons-logging-1.1.3.jar freema ...

  6. poj1083 贪心

    K - 简单dp Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bit ...

  7. Python爬虫——抓取贴吧帖子

    抓取百度贴吧帖子 按照这个学习教程,一步一步写出来,中间遇到很多的问题,一一列举 首先, 获得 标题 和 贴子总数 # -*- coding:utf-8 -*- #!/user/bin/python ...

  8. 交叉编译安装ARM平台上的Qt

    一.宿主机环境搭建: 编译需要x11库的支持,在Ubuntu下安装命令: sudo apt-get install libx11-dev libxext-dev libxtst-dev 二.下载源码包 ...

  9. django 学习杂记

    django1.9 学习路径 http://python.usyiyi.cn/django/intro/tutorial02.html django 中url路径带参数,在view中应该如何处理 应该 ...

  10. 消息提醒,初探Notification

    1:MainActivity.java package com.example.notificationtest; import android.app.Activity; import androi ...