bug:C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
2016-05-16 16:46
288 查看
今天遇到这个问题,百度了下,把解决的方法总结出来。
我们在ui线程创建的子线程操作ui控件时,系统提示错误详细信息为:
线程间操作无效: 从不是创建控件“XXX”的线程访问它。
就我知道的有三种方法,先看一下msdn的介绍:
访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。
还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。
看下解决办法吧
1、把CheckForIllegalCrossThreadCalls设置为false
2、利用委托
delegate void SetTextCallBack(string text);
private void SetText(string text)
{
if (this.InvokeRequired)//Control.InvokeReauqired判断是否是创建控件线程,不是为true,则需要invoke到创建控件的线程,是就为false,直接操作控件
{
SetTextCallBack stcb = new SetTextCallBack(SetText);
this.Invoke(stcb , new object[] { text});
}
else
{
this.txt_a.Text = text;
}
}
private void LoadData()
{
SetText("测试");
}
//窗体加载时,用线程加载数据
private void Frm_ImportManager_Load(object sender, EventArgs e)
{
ThreadStart ts = new ThreadStart(LoadData);
Thread thread = new Thread(ts);
thread.Name = "LoadData";
thread.Start();
}
我们在ui线程创建的子线程操作ui控件时,系统提示错误详细信息为:
线程间操作无效: 从不是创建控件“XXX”的线程访问它。
就我知道的有三种方法,先看一下msdn的介绍:
访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。
还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。
看下解决办法吧
1、把CheckForIllegalCrossThreadCalls设置为false
2、利用委托
delegate void SetTextCallBack(string text);
private void SetText(string text)
{
if (this.InvokeRequired)//Control.InvokeReauqired判断是否是创建控件线程,不是为true,则需要invoke到创建控件的线程,是就为false,直接操作控件
{
SetTextCallBack stcb = new SetTextCallBack(SetText);
this.Invoke(stcb , new object[] { text});
}
else
{
this.txt_a.Text = text;
}
}
private void LoadData()
{
SetText("测试");
}
//窗体加载时,用线程加载数据
private void Frm_ImportManager_Load(object sender, EventArgs e)
{
ThreadStart ts = new ThreadStart(LoadData);
Thread thread = new Thread(ts);
thread.Name = "LoadData";
thread.Start();
}
相关文章推荐
- Hide Start Button and TaskBar in Win7 or WinXP by Using C#
- C# DataGridView的单元格输入限制,并提示用户 数字,小数点
- C# Hashtable类
- C#.net开发 List与DataTable相互转换
- 【C#公共帮助类】 Log4net 帮助类
- C#实现通过模板自动创建Word文档的方法
- C#生成World文档
- 将C#文档注释生成.chm帮助文档
- C# 调用中通快递查询物流轨迹接口
- C#学习笔记之File类
- C#详解反射
- [转载]C#4.0中的可选参数和命名参数
- 【205】C#实现远程桌面访问
- C# using
- c# 使用递归 循环遍历导航树结构 并解析
- 研华IO卡C#调用
- C# 使用ColorMatrix时各种效果的参数
- C# Windows API
- C#和.NET框架和术语
- C#中Invoke 和 BeginInvoke 的区别