winform跨线程

在winform中经常用到多线程,那么用多线程对控件进行赋值和修改的时候呢会出现类似“该控件不是当前线程创建”的错误信息,在winform中两种办法:

1.在加载事件中写这句话,其作用呢就是线程的异步调用

1 System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

2.用委托来实现线程对控件的赋值操作

1 public delegate void OutDelegate(string text);
2 public void OutText(string text)
3 {
4 txt.AppendText(text);
5 txt.AppendText( "\t\n" );
6 }
7 OutDelegate outdelegate = new OutDelegate( OutText );
8 this.BeginInvoke(outdelegate, new object[]{text});

补充一句:

在winform中创建带参数的线程,可以这么写

1 Thread thread = new Thread(new ParameterizedThreadStart(getweathering));
2
3 thread.Start(comboBox4.Text);
4
5
6
7 void getweathering(string temptext)
8
9 {}
时间: 2024-11-09 09:28:53

winform跨线程的相关文章

Winform跨线程操作GUI

一直以来都是做Web开发,虽然乱七八糟什么都接触一些,但几乎不怎么接触Winform, WPF这些,也很少接触多线程开发. 在公司有时候没有事儿做,但又不能随意上网浏览新闻什么的,会被IT监控,看多了总归不好.QQ也被禁用.大家用的都是OC.OC的聊天记录也会被上传到服务器.所以闲着的时候就开始决定做一个Winform的聊天室.初步包括 登陆,群聊,私聊,查看在线列表 这些基本功能. 今天遇到一个问题,上网查了一下,答案虽然正确,但让初步接触的我看的稀里糊涂的,大部分都是复制粘贴,甚至还出现了中

C# Winform 跨线程更新UI控件常用方法总结(转)

出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种: 1. 通过UI线程的SynchronizationContext的Post/Send方法更新: 2. 通过UI控件的Invoke/BegainInvoke方法更新: 3. 通过BackgroundWorker取代Thre

WinForm跨线程访问控件异常

WinForm跨线程访问控件异常 最近做了个WinForm的小项目,遇到个简单的问题记录下.需求:点击"下载",显示正在下载,下载完后更新状态为"ready"(要求用多线程,避免前台卡死). 做法 新建一个线程,在新线程中下在更新控件状态,报异常跨线程程访问控件(当然可以通过关闭跨线程访问控件检验解决,不鼓励这么做).应该C#5.0版本添加的任务Task异步,这里用异步解决. Code 新建WinForm 项目,Form1添加控件如图 后台代码 private vo

C# Winform 跨线程更新UI控件常用方法汇总

C# Winform 跨线程更新UI控件常用方法汇总 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. 通过UI线程的SynchronizationContext的Post/Send方法更新:2. 通过UI控件的Invoke/BeginInvoke方法更新: 3. 通过BackgroundWorker取代Thread执行异步操作:4. 通过设置窗体

winform跨线程问题

1.invoke是同步线程 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading; 9 using System.Threading.Tasks; 10 using

实现Winform 跨线程安全访问UI控件

在多线程操作WinForm窗体上的控件时,出现"线程间操作无效:从不是创建控件XXXX的线程访问它",那是因为默认情况下,在Windows应用程序中,.NET Framework不允许在一个线程中直接操作另一个线程中的控件(因为访问Windows窗体控件本质上不是线程安全的).微软为了线程安全,窗体上的控件只能通过创建控件的线程来操作控件的数据,也就是只能是UI线程来操作窗体上的控件!可看看Control的Invoke和BeginInvoke 要解决这个问题可以用以下方法: 1.关闭线

C#之Winform跨线程访问控件

C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用new MethodInvoker(LoadGlobalImage)来完成下面的步骤,这个做法保证了控件的安全,你可以这样理解,有人想找你借钱,他可以直接在你的钱包中拿,这样太不安全,因此必须让别人先要告诉你,你再从自己的钱包把钱拿出来借给别人,这样就安全了 ----------------------

C# winform 跨线程更改窗体控件的属性

当winform程序中新开一个线程,是无法改变主线程中窗体控件的属性的,否则运行时会报错. 若想在其他线程中控制主线程中的窗体控件,则必须利用BeginInvoke方法. 例如:添加一个名为textbox1的TextBox控件,想将它的Visible设置为false,则执行下面的代码即可 textbox1.BeginInvoke(new Action(() => { textbox1.Visible= false; })); 另外WPF中,想达到winform同样的效果,利用Dispatcher

winform 跨线程访问控件

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 {