问题引出:

winform程序中的耗时操作,一般不能在UI线程中执行,需要另开线程。往往我们需要在耗时操作结束后将结果显示在UI上。

以下是Mainform.cs中调用耗时操作的一段代码:

     Job j = new Job();
j.runJob();

这里耗时操作被封装在类Job中,调用 j.runJob() 开始耗时操作。其中runJob中封装了开启新线程执行任务的代码。

Job运行完后需要返回一个结果并显示在UI上。

显而易见的方法是,在Job中实例化一个Mainform对象,然后直接在Job中对UI进行修改。这种方法极其不提倡,极大的增加了类之间的耦合性。

可以想到的一种合理的方法,Job类完成了耗时任务之后给调用它的类发送“消息”,”消息“中还包括了应该显示的结果。Job方还应该做到:只管发送”消息“,而不管发送给谁。这样就算更换了调用方,Job类的代码也不需要进行修改。这样的”消息“在C#中即为”事件“。

方法步骤:

1.在Job类(需要调用其他类中方法的类)中声明这两个变量:

         public delegate void FinishHandler(int param);   //声明委托
public event FinishHandler FinishEvent; //声明事件

委托的变量名可随意命名,括号中定义了要传递参数的类型和个数,这里需要传递一个int变量。

第二行事件的类型要于委托的名称一样。

2.在Job类(需要调用其他类中方法的类)中合适的地方调用事件:

     FinishEvent(score);

合适的地方一般来说就是耗时操作结束,需要返回结果时。

括号内参数形式与个数要与第一步中定义的一致。

3.将事件发生时需要执行的方法注册到事件中

     Job j = new Job();
j.FinishEvent += updateData;
j.runJob();

当然,updateData的参数形式和个数也和第一步时一样。

分析总结:

梳理一下运行程序时发生了什么。

实际运行时,首先运行的是第3步中的三行代码。

第二行表示updateData方法会被j对象中的FinishEvent事件触发。

第三行开始运行耗时任务,Job类在执行到任务结束准备返回数据时,来到了第二步中的那行代码,此时,会触发所有注册了该事件的方法开始执行。
这样从MainForm的角度看,实现了异步调用,耗时任务的结果通过另一个函数读取。

从Job类的角度看,调用了另一个类中的方法。

更多应用待之后编程实践中发现。

C#中运用事件实现异步调用的更多相关文章

  1. NET中级课--浅谈委托,事件,异步调用,回调等概念

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

  2. spring boot中使用@Async实现异步调用任务

    本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 什么是“异步调用”? “异步调用”对应的是“同步 ...

  3. ABAP中的同步和异步调用

    ABAP 的 CALL FUNCTION 类似于 Java/.NET 中的本地或远程方法调用.CALL FUNCTION 可以分为四种:1. Synchronous RFC (sRFC) - 同步调用 ...

  4. Spring Boot中使用@Async实现异步调用

    在Spring Boot中,我们只需要通过使用@Async注解就能简单的将原来的同步函数变为异步函数,为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsyn ...

  5. 56. spring boot中使用@Async实现异步调用【从零开始学Spring Boot】

    什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执 ...

  6. 使用Spring中@Async注解实现异步调用

    异步调用? 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕,继 ...

  7. Spring Boot中使用@Async实现异步调用,加速任务的执行!

    什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行 ...

  8. IE9中input事件与异步事件连用会发生跨域问题

    IE版本中IE8以及IE9以上版本不会存在这个问题唯独IE9 发生跨域问题代码 $("#stock_code").bind("input",function(e ...

  9. C#中的异步调用及异步设计模式(三)——基于事件的异步模式

    四.基于事件的异步模式(设计层面) 基于事件的C#异步编程模式是比IAsyncResult模式更高级的一种异步编程模式,也被用在更多的场合.该异步模式具有以下优点: ·                 ...

随机推荐

  1. Java笔记(十六)……内部类

    内部类概述 内部类是将一个类定义在另一个类里面,对里面那个类就成为内部类(内部类,嵌套类). 当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容 访问特点 内部类 ...

  2. c++ 派生类向基类转换的可访问性

    对于c++面向对象一直很疑惑,这次决定下功夫把它弄明白 一.派生类和基类之间的类型转换 首先理解,派生类含有基类的所有成分,只不过有些就算在派生类的成员函数也不能访问而已. (1)派生类和基类的自动转 ...

  3. delphi 提取字符中的数字

    Function Setstring(cString:string):string;   {提取数字} VAr   i:integer;   str:string;  begin    str:='' ...

  4. gcc编译选项的循环重复查找依赖库等命令

    link时,若liba.a依赖libb.a,若这样写 -lb -la,则链接通不过,gcc有个选项:-Xlinker ,可以让gcc在链接时反复查找依赖库,用法 : gcc -shared -o li ...

  5. ios 免书籍入门站点

    http://www.raywenderlich.com/tutorials http://www.raywenderlich.com/ios-tutorials http://web.stanfor ...

  6. Node.js学习(14)----EJS模板引擎

    这个入门教程将从以下几个方面来讲解: 1. 引入EJS 2. 创建一个模板 3. 使用视图工具组件 4. 使用错误处理组件 5. 什么情况下应使用EJS 引入EJS 在我们正式开始前,我们先来做点准备 ...

  7. HDU 1518 Square

    解题思路:sum%4!=0    , max<sum/4 #include<iostream>#include<cstdio>#include<cstring> ...

  8. zookeeper-3.4.8 集群搭建

    一.虚拟机环境 见我的另一篇博客http://www.cnblogs.com/xckk/p/6000881.html, zookeeper是用JAVA编写,因此需要安装JDK环境,centos下安装J ...

  9. xml配置和基于java类的bean配置搭配使用

    如果同时使用了xml配置,和java类的bean配置(当然估计项目中一般不会这样), 在初始化容器指定资源文件的时候可能会比较麻烦 此时我们可以把基于java类的bean配置整合到xml中,或xml的 ...

  10. 为Windows 7的winsxs目录瘦身,谨慎。

    刚使用Win7 系统不久,前段时间在清理系统垃圾时发现,win7系统的windows文件夹下的winsxs 文件夹占用空间很大,想清理之,却提示无权限无法清理.随即在网上查了个到底,原来winsxs是 ...