Visual studio之C#跨线程调用UI控件
背景
当前串口通讯项目,多个线程需要同时利用richTextBoxMsg控件打印信息,直接调用会造成线程不安全,严重的时候会直接导致UI线程挂掉,因此本篇就跨线程调用UI控件做个记录。
正文
- 定义控件的委托类型
 
// 提示界面控件的委托类型
delegate void ShowInfoCallback(string text, bool handle);
- 定义操作该控件的函数
 
//该函数会在非创建UI控件的线程调用下,进行委托,由UI线程进行操作UI控件;
//若该函数由创建该UI控件的线程调用,则直接进行操作。
// handle 为 true,则为控件使用.text;为false,则控件使用.Appendtext
private void Showinfo(string text, bool handle)
{
        if (this.richTextBoxMsg.InvokeRequired)
        {   //若是创建控件的线程与调用该函数的线程不是同一个线程则进入
            while (!this.richTextBoxMsg.IsHandleCreated)
            {
                if (this.richTextBoxMsg.Disposing || this.richTextBoxMsg.IsDisposed)
                {// 解决窗体关闭时出现“访问已释放句柄的异常”
                    return;
                }
             }
             ShowInfoCallback d = new ShowInfoCallback(Showinfo);
             this.richTextBoxMsg.Invoke(d, new object[] { text, handle });
        }
        else
        {
            if(handle == true)
            {
                this.richTextBoxMsg.Text = text;
            }
            else
            {
                this.richTextBoxMsg.AppendText(text);
             }
        }
}
- 调用方法
直接调用即可。 
至此记录完毕。
参考链接
记录时间:2017-05-25
记录地点:江苏淮安
Visual studio之C#跨线程调用UI控件的更多相关文章
- 跨线程访问UI控件时的Lambda表达式
		
工作中经常会用到跨线程访问UI控件的情况,由于.net本身机制,是不允许在非UI线程访问UI控件的,实际上跨线程访问UI控件还是 将访问UI的操作交给UI线程来处理的, 利用Control.Invok ...
 - (转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例
		
http://2sharings.com/2014/net-4-5-task-run-parallel-for-winform-cross-multiple-threads-update-ui-dem ...
 - Atitit.swt 线程调用ui控件的方法
		
Atitit.swt 线程调用ui控件的方法 1 SwingUtilities.invokeLater1 2 display.asyncExec方法1 3 display.timerExec(500 ...
 - C# 跨线程调用form控件技巧及byte[]与string型相互转换
		
跨线程调用form控件技巧 private delegate void MethodSocket(object obj);//使用托管 ss = "OK"; this.BeginI ...
 - C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题
		
如何:对 Windows 窗体控件进行线程安全调用 访问 Windows 窗体控件本质上不是线程安全的. 如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态. 还可能会出现 ...
 - C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
		
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...
 - C# Winform 跨线程更新UI控件常用方法总结(转)
		
出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件 ...
 - 理解SynchronizationContext,如何在Winform里面跨线程访问UI控件
		
SynchronizationContext 类是一个基类,可提供不带同步的自由线程上下文. 此类实现的同步模型的目的是使公共语言运行库内部的异步/同步操作能够针对不同的异步模型采取正确的行为.此模型 ...
 - WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )
		
WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...
 
随机推荐
- Xamarin Android项目提示SDK版本太老
			
Xamarin Android项目提示SDK版本太老 错误信息:The installed Android SDK is too old.Version 24.3.4 or newer is requ ...
 - 杭电oj 1001
			
#include<iostream> using namespace std; int main() { , sum; while (cin>>n) { sum = ; // ...
 - HDU 4388 Stone Game II 博弈论 找规律
			
http://acm.hdu.edu.cn/showproblem.php?pid=4388 http://blog.csdn.net/y1196645376/article/details/5214 ...
 - [Codeforces-div.1 167B] Wizards and Huge Prize
			
[Codeforces-div.1 167B] Wizards and Huge Prize 试题分析 注意到每个物品互相独立,互不干扰之后就非常好做了. 算出一个物品最后的价值期望,然后乘以K即可. ...
 - 【树形dp】Treasure Hunt I
			
[ZOJ3626]Treasure Hunt I Time Limit: 2 Seconds Memory Limit: 65536 KB Akiba is a dangerous coun ...
 - BZOJ 1475 方格取数(二分图最大点权独立集)
			
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1475 [题目大意] 给出一个n*n的方格,从中取一些不相邻的数字,使得和最大 [题解] ...
 - 【动态规划】POJ3280- Cheapest Palindrome
			
[题目大意] 给出一个字符串,可以删除或添加一些字符,它们各自会消耗价值.问最少消耗多少价值,可以使得字符串变成回文的. [思路] 事实上删除或添加字符的价值只需要保持较小的那一个.假设当前要将(j, ...
 - 推荐一套WPF主题皮肤
			
在CodePlex上发现了一套WPF的主题皮肤,直接应用于系统自带的控件,一共有四种配色方案,做得也还比较精致.感兴趣的朋友可以使用一下.点击下载 另外一套我比较喜欢的皮肤这里也推荐一下吧: ...
 - 用 Jenkins + .netcore 2.0 构建
			
上一篇是关于 .net framework 框架的, 今天是关于 .netcore 2.0 的 这里为大家分享 配置中踩到的坑 cd %WORKSPACE%\"需要还原的项目目录" ...
 - 【centOS】【xshell】xshell连接虚拟机上的centOS,操作途中突然断开连接,报错:connect closed by foreign host
			
如题 xshell连接虚拟机上的centOS,操作途中突然断开连接,报错:connect closed by foreign host 快捷解决方法: 在虚拟机上centOS重新启动网络,即可解决问 ...