关于多线程环境下安全调用窗体控件方法
来源:互联网 发布:网络有时候不稳定会断 编辑:程序博客网 时间:2024/06/06 01:30
我们都知道如何在多线程环境下面调用外部控件方法会造成跨线程异常,而常用的方法为设置系统去忽略这个错误,这是比较错误的做法。今天就来学习下如何去安全的跨线程调用外部控件方法。
首先我们使用RichTextBox作为示例,正常情况下面RichTextBox的AppendText添加显示数据不会出现异常,而在多线程情况下面就会出现错误提示。这时候我们就需要定义一个用于多线程情况下进行AppendText的方法。
void WriteLog(Color color, string text, params object[] param) { if (!this.rtbx_system_log.InvokeRequired) { this.rtbx_system_log.ScrollToCaret(); this.rtbx_system_log.SelectionColor = color; this.rtbx_system_log.AppendText(string.Format("{0}:{1}\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), string.Format(text, param))); } else { delWriteLog log = new delWriteLog(WriteLog); this.rtbx_system_log.Invoke(log, new object[] { color, text, param }); } }
1、首先我们需要判断是主线程还是其他线程调用的此方法
!this.rtbx_system_log.InvokeRequired否则表示为主线程调用此方法,则可以直接添加数据,因为这个控件是由主线程创建的,故主线程拥有对他的直接操作权。
反之如果不是主线程调用,则我们需要把我们添加数据这个操作打成一个包,委托给控件的主线程去操作:
2、故我们首先定义一个包格式,即为委托,委托需要和WriteLog参数一致
private delegate void delWriteLog(Color color, string text, params object[] param);
delWriteLog log = new delWriteLog(WriteLog);this.rtbx_system_log.Invoke(log, new object[] { color, text, param });
完成以上定义后则可以在任意地方直接调用WriteLog方法。
但是在某些并发调用的情况下面则会出现线程冲突的情况,我们这个时候就需要lock一下RichTextBox的操作
void WriteLog(Color color, string text, params object[] param) { if (!this.rtbx_system_log.InvokeRequired) { lock (logObject) { this.rtbx_system_log.ScrollToCaret(); this.rtbx_system_log.SelectionColor = color; this.rtbx_system_log.AppendText(string.Format("{0}:{1}\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), string.Format(text, param))); } } else { delWriteLog log = new delWriteLog(WriteLog); this.rtbx_system_log.Invoke(log, new object[] { color, text, param }); } }
0 0
- 关于多线程环境下安全调用窗体控件方法
- C#多线程窗体控件安全访问实现方法
- 关于 Windows 窗体控件进行线程安全调用
- C# Winform项目中多线程环境下, 如何跨线程对Window窗体控件进行安全访问?
- 对 Windows 窗体控件进行线程安全调用的方法
- 关于在窗体中使用多线程调用控件的方式
- C#多线程窗体控件安全访问
- C#多线程窗体控件安全访问
- C#多线程窗体控件安全访问
- 关于跨窗体调用控件
- Windows 窗体控件进行线程安全调用
- 跨线程安全调用Windows 窗体控件
- 窗体控件的线程安全调用
- c# winform下使用多线程时在线程里如何安全访问窗体控件InvokeRequired
- C#2005 多线程中调用窗体控件
- c# vs2005 多线程中调用窗体控件
- cs 界面多线程调用窗体控件
- 如何在子线程中通过安全调用方法操作窗体控件
- Word Pattern
- Nokogiri解析html/xml
- 美团和当当推荐系统文章
- 深入了解javascript--立即调用的函数表达式
- 常用函数--不同时间粒度循环取数之sp_Utl_CalculateTimeBorder
- 关于多线程环境下安全调用窗体控件方法
- 位图图像基础
- SQL LIKE 操作符 高级教程
- Unity5.x Ugui Button事件 及 改变Text 内容
- 浏览器工作原理
- Exchange Server 2016正式发布啦
- 利用spring定时器发送定时邮件
- Zookeeper源码分析(四)-zoo.cfg的详解和选举的概念
- 为什么要成为一家4点半下班的企业