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#中运用事件实现异步调用
- c# asp.net js 实现异步调用 ajax基础
- C#中的异步调用及异步设计模式(三)——基于事件的异步模式
- C#中事件的动态调用实现方法
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 利用System.EventHandler来实现两个窗体间的事件调用 (C#)
- C#调用C++DLL中的回调函数(异步的情况,DLL中会在事件触发时调用函数)
- C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法
- C#事件异步调用
- C# 委托事件的异步调用
- C# 异步实现方法调用
- 转载:C#实现快捷键(系统热键)响应 以及事件调用
- C#事件调用,实现两个窗体间传值
- C#构建多线程应用程序(1) —— 使用委托来自动创建次线程以实现异步方法的调用
- C#通过委托和异步调用实现窗体间的通讯
- C#中的异步调用及异步设计模式(三)——基于事件的异步模式
- C#中的异步调用及异步设计模式(三)——基于事件的异步模式
- c#中实现当一个类实例的属性值改变时,触发事件调用另一个方法
- C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法
- spring学习笔记(15)趣谈spring 事件:实现业务逻辑解耦,异步调用提升用户体验