C#中运用事件实现异步调用
问题引出:
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#中运用事件实现异步调用的更多相关文章
- NET中级课--浅谈委托,事件,异步调用,回调等概念
直接说题. 委托 首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托. 委托是某 ...
- spring boot中使用@Async实现异步调用任务
本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 什么是“异步调用”? “异步调用”对应的是“同步 ...
- ABAP中的同步和异步调用
ABAP 的 CALL FUNCTION 类似于 Java/.NET 中的本地或远程方法调用.CALL FUNCTION 可以分为四种:1. Synchronous RFC (sRFC) - 同步调用 ...
- Spring Boot中使用@Async实现异步调用
在Spring Boot中,我们只需要通过使用@Async注解就能简单的将原来的同步函数变为异步函数,为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsyn ...
- 56. spring boot中使用@Async实现异步调用【从零开始学Spring Boot】
什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执 ...
- 使用Spring中@Async注解实现异步调用
异步调用? 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕,继 ...
- Spring Boot中使用@Async实现异步调用,加速任务的执行!
什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行 ...
- IE9中input事件与异步事件连用会发生跨域问题
IE版本中IE8以及IE9以上版本不会存在这个问题唯独IE9 发生跨域问题代码 $("#stock_code").bind("input",function(e ...
- C#中的异步调用及异步设计模式(三)——基于事件的异步模式
四.基于事件的异步模式(设计层面) 基于事件的C#异步编程模式是比IAsyncResult模式更高级的一种异步编程模式,也被用在更多的场合.该异步模式具有以下优点: · ...
随机推荐
- bzoj 1925 [Sdoi2010]地精部落(DP)
Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...
- ACM 2015年上海区域赛A题 HDU 5572An Easy Physics Problem
题意: 光滑平面,一个刚性小球,一个固定的刚性圆柱体 ,给定圆柱体圆心坐标,半径 ,小球起点坐标,起始运动方向(向量) ,终点坐标 ,问能否到达终点,小球运动中如果碰到圆柱体会反射. 学到了向量模板, ...
- delphi 提取字符中的数字
Function Setstring(cString:string):string; {提取数字} VAr i:integer; str:string; begin str:='' ...
- java dubug调试
摘要:调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷.对于Java程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序.本文介绍了Java程序员必知的10个调试 ...
- 数据流模型、Storm数据流模型
- GCC扩展 __attribute__ ((visibility("hidden")))
试想这样的情景,程序调用某函数A,A函数存在于两个动态链接库liba.so,libb.so中,并且程序执行需要链接这两个库,此时程序调用的A函数到底是来自于a还是b呢? 这取决于链接时的顺序,比如先链 ...
- 再看GOPATH
原本不打算介绍GOPATH,然而,总是有初学者问一些关于GOPATH的问题,因此在这里再介绍一下GOPATH GOPATH环境变量用于指定这样一些目录:除$GOROOT之外的包含Go项目源代码和二进制 ...
- 易元平台使用-MVC体会
M:服务-提供数据 V:freemaker-提供显示方式 C:控制器-控制显示方式
- Android ArrayAdpater 填充集合
在这里我们新创建一个任务来演示 然后再布局文件中定义一个ListView 来当作显示数据的容器,布局文件代码如下: <LinearLayout xmlns:android="http: ...
- Oracle—用户管理的完全恢复(一)
一.分类 可以分为在非归档模式下和归档模式下的完全恢复,完全恢复主要是针对归档模式下的,在非归档模式下很难做到完全恢复,除非是在做恢复时,联机重做日志还没有被重写. 二.非归档的有关性质 1.在非归档 ...