C#学习之多线程开发技术(十三)
2015-10-07 21:53
519 查看
之前就学习了关于使用委托的方法。我是看的视频教学,现在把代码贴出来(视频中的),方便自己再次温习委托机制。
这哥们的代码风格,我很赞同呢。注释做的不赖,很容易懂。这点需要向TA学习呀
建议大家养成写注释习惯哦(也是在提醒自己)
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回。回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知,因此可知回调机制是实现异步调用的基础。
参考自己之前写的关于委托机制的笔记----委托机制
这哥们的代码风格,我很赞同呢。注释做的不赖,很容易懂。这点需要向TA学习呀
建议大家养成写注释习惯哦(也是在提醒自己)
---------------委托机制代码
#region 命名空间引用 using System; using System.Text; using System.Data; using System.Drawing; using System.Windows.Forms; using System.Threading; using System.Collections.Generic; using System.ComponentModel; #endregion namespace _001_委托机制_Template { public partial class frmMain : Form { #region 委托 // 定义委托使用关键字 delegate private delegate void SetProgressBarValueDelegate(int value); // 声明委托 private SetProgressBarValueDelegate setProgressBarValue; #endregion #region 窗体事件 // 窗体构造方法 public frmMain() { InitializeComponent(); } #endregion #region 控件事件 // 开始按钮被单击事件 private void btnStart_Click(object sender, EventArgs e) { #region 不使用委托 //// 设置进度条1的值 //for (int i = 1; i <= 100; i++) //{ // /* 此命令可告诉系统继续处理用户界面的其它事件,避免假死 // * 等同于 Visual Basic 6.0 的 DoEvents() // * 等同于 易语言 的 处理事件() */ // Application.DoEvents(); // /* 此命令用于线程暂停(参数:毫秒) // * 此处用在主线程中,会导致假死,加暂停只为了看得更清楚 */ // Thread.Sleep(50); // // ProgressBar 的 Value 属性表示进度条当前的值(进度) // pgProgressBar1.Value = i; //} //// 设置进度条2的值 //for (int i = 1; i <= 100; i++) //{ // Application.DoEvents(); // Thread.Sleep(50); // pgProgressBar2.Value = i; //} #endregion #region 使用委托 // 实例化委托 setProgressBarValue = new SetProgressBarValueDelegate(SetProgressBarValue1); SetProgressBarValueMethod(setProgressBarValue); setProgressBarValue = new SetProgressBarValueDelegate(SetProgressBarValue2); SetProgressBarValueMethod(setProgressBarValue); #endregion } #endregion #region 方法 // 设置进度条值 private void SetProgressBarValueMethod(SetProgressBarValueDelegate setProgressBarValueDelegate) { for (int i = 1; i <= 100; i++) { Application.DoEvents(); Thread.Sleep(50); setProgressBarValueDelegate(i); } } // 设置进度条1值 private void SetProgressBarValue1(int value) { pgProgressBar1.Value = value; } // 设置进度条2值 private void SetProgressBarValue2(int value) { pgProgressBar2.Value = value; } #endregion } }
-----------回调机制代码
什么是回调?软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回。回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知,因此可知回调机制是实现异步调用的基础。
#region 命名空间引用 using System; using System.Text; using System.Data; using System.Drawing; using System.Windows.Forms; using System.Threading; using System.Collections.Generic; using System.ComponentModel; #endregion namespace _002_回调机制_Template { public partial class frmMain : Form { #region 回调 // 定义回调使用关键字 delegate(回调是委托的一种应用,其本质就是委托) private delegate void SetProgressBarValueCallBack(int value); // 声明回调(一般回调多用在线程,因此多声明为类级变量) private SetProgressBarValueCallBack setProgressBarValueCallBack; #endregion #region 窗体事件 // 窗体构造方法 public frmMain() { InitializeComponent(); } #endregion #region 控件事件 // 开始滚动按钮被单击事件 private void btnStart_Click(object sender, EventArgs e) { #region 使用线程而不使用委托 // 将检查合法跨线程调用设置为 false 表示不检查 // 项目开发中不允许这样使用,因此会导致非线程安全而出现奇葩BUG //frmMain.CheckForIllegalCrossThreadCalls = false; #endregion // 初始化回调方法(本质为实例化委托) setProgressBarValueCallBack = new SetProgressBarValueCallBack(SetValueMethod); // 必须先启动线程,再进行阻塞操作,否则将等待阻塞操作完成才会启动线程 // 创建并启动线程设置进度条2的值 Thread SetProgressBar2ValueThread = new Thread(SetProgressBar2Value); SetProgressBar2ValueThread.Start(); for (int i = 0; i <= 100; i++) { Application.DoEvents(); Thread.Sleep(50); pgProgressBar1.Value = i; } } #endregion #region 线程 // 设置进度条2的值的线程 private void SetProgressBar2Value() { for (int i = 0; i <= 100; i++) { Thread.Sleep(50); // 触发操作对象的动作(本质就是将委托作为参数传递给控件的 Invoke 方法,此方法专门用于接受委托) pgProgressBar2.Invoke(setProgressBarValueCallBack, i); //pgProgressBar2.Value = i; } } #endregion #region 方法 // 设置进度条2的值的被委托方法 private void SetValueMethod(int value) { pgProgressBar2.Value = value; } #endregion } }
参考自己之前写的关于委托机制的笔记----委托机制
相关文章推荐
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#生成饼形图及添加文字说明实例代码
- C#判等对象是否相等的方法汇总
- C#简单的向量用法实例教程
- C#实现基于链表的内存记事本实例
- C#托管堆对象实例包含内容分析