操作不同线程中的控件

操作不同线程中的控件会报错。可以通过以下方法来实现,本质上是委托里注册了方法来异步触发,类似事件。

Action action = new Action(() =>
{
regTreeViewMenu.Close();
LoadTree(bllsbs.RegTreeView, regTreeView);
}

if (InvokeRequired)
{
Invoke(action);
}
else
{
action.Invoke();
}

时间: 2024-11-07 01:35:46

操作不同线程中的控件的相关文章

[转]MFC子线程中更新控件内容的两种办法

一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线程中运行,而所有与主UI线程有关的控件数据刷新应该到主UI线程中处理.也就是数据处理线程发消息,让界面UI去更新控件.在MFC中线程分为界面线程和工作者线程,界面实际就是一个线程画出来的东西,这个线程维护一个"消息队列","消息队列"也是界面线程和工作者线程的最大区别,

在WinForm中使用委托来在其他线程中改变控件的显示

假设winform中有两个控件: 1.ListView用来显示进度的文本提示,ID:listView_progressInfo 2.ProgressBar用来显示进度,ID:progressBar1 在此winform的后台.cs文件中声明两个公用委托类型:ControlChanger, ProgressChanger public delegate void ControlChanger(string progressText); public delegate void ProgressCh

线程中为控件赋值Winform

this.Invoke(new MethodInvoker(() => { //TO DO })); this.Invoke(new Action(()=>{ // TO DO })); 原文地址:https://www.cnblogs.com/XuPengLB/p/8182340.html

在C#中子线程如何操作主窗口线程上的控件

在C#中子线程怎样操作主线程中窗口上控件 在C#中,直接在子线程中对窗口上的控件操作是会出现异常,这是因为子线程和运行窗口的线程是不同的空间,因此想要在子线程来操作窗口上的控件.是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法.其作用就是让子线程告诉窗口线程来完毕对应的控件操作. 要实现该功能,基本思路例如以下: 把想对还有一线程中的控件实施的操作放到一个函数中,然后使用delegate代理那个函数.而且在那个函数中加入一个推断,用 InvokeRequir

C#子线程更新UI控件的方法总结

http://blog.csdn.net/jqncc/article/details/16342121 在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从子线程直接修改控件属性时会出现“从不是创建控件的线程访问它”的异常提示. 跨线程更新UI控件的常用方法有两种: 1.使用控件自身的invoke/BeginInvoke方法 2.使用SynchronizationContext的Post/Send方法更新 1.使用控件自身的invoke/BeginIn

关于“线程间操作无效: 从不是创建控件’textBox1‘的线程访问它”异常的解决方法

线程间操作无效: 从不是创建控件“textBox1”的线程访问它 背景:通过一个辅助线程计算出的一个值赋给textBox1.text;解决办法:1.直接在窗体的构造函数中加:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 此时把所有的控件 合法性线程检查全部都给禁止掉了. 2.通过代理来解决(msdn) private delegate void SetTextCallback(string text);

线程间操作无效: 从不是创建控件“button1”的线程访问它。

.net2后是不能跨线程访问控件的.,窗体上的控件是当前主线程创建的,当用户异步执行一个方法:在该方法中给窗体上的控件赋值,记住:当执行一个异步委托的时候,其实 就是开了一个线程去执行那个方法,这样就会报错:线程间操作无效: 从不是创建控件“某某某”的线程访问它. C# WinForm开 发中,这是一个比较常见的异常:线程间操作无效,从不是创建控件“xxx”的线程访问它.这个异常来源于.NET2的一个限制:工作线程不能访问窗口线程 创建的控件.解决方法主要有两种,一种是在窗口线程中设置Check

线程间操作无效: 从不是创建控件“”的线程访问它 解决办法(转)

线程间操作无效: 从不是创建控件“”的线程访问它 解决办法 http://blog.sina.com.cn/s/blog_568e66230101der7.html 利用FileSystemWatcher设计一个文件监控系统时,如果一个文件被修改或者新建,则文件修改事件会被多次触发而产生多条信息.为了将一个文件被修改一次而产生的多条信息归结为一条,在设计中新开了一个线程,在指定时间内(如2秒内)这个文件的修改被认为是一次修改,从而只产生一条信息. 这个工作完成后,又出现了另外一个问题:因为需要在

线程使用中常见的错误-“System.InvalidOperationException”线程间操作无效: 从不是创建控件“ ”的线程访问它。

"System.InvalidOperationException"类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 线程间操作无效: 从不是创建控件"label1"的线程访问它. 解决方法: 1 构造方法中添加 CheckForIllegalCrossThreadCalls = false; 2 方法二 invoke label1.Invoke(new Action<string>((str) => {