C#怎样用新线程来处理子c 窗体 线程的数据更新

博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)C#在子线程中更新窗口部件的写法
转载 & & 投稿:junjie
这篇文章主要介绍了C#在子线程中更新窗口部件的写法,本文直接给出代码示例,需要的朋友可以参考下
if (textBox1.InvokeRequired)
textBox1.Invoke(new MethodInvoker(delegate
textBox1.AppendText(sb.ToString());
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具//这个问题也不知道难倒了多少C#豪杰。比起MFC的界面刷新,在WINFORM中来实现多线程刷新真是很痛苦,故写此文。
//多线程刷新界面主要用到多线程,委托,线程安全、事件等一系列高难度的C#操作。
//关于委托和事件,这有一篇很易懂的文章:hi.baidu.com/anglecloudy/blog/item/a52f2df534ab.html
//===============================================
//先从一个简单的例子说起,是一个没有考虑线程安全的写法:
//先在一个FORM类里面定义一个委托和事件:
  protected delegate void UpdateControlText1(string str);
//定义更新控件的方法
protected void updateControlText(string str)
this.lbStatus.Text =
//在线程函数里面加上下面的内容
UpdateControlText1 update = new UpdateControlText1(updateControlText);//定义委托
this.Invoke(update, "OK");//调用窗体Invoke方法
//这个线程函数必须是类的线程函数,这样用很方便,但有很高的局限性,下面来说个复杂的。
//==============================================
//先定义一个独立的类
public class MoreTime
public delegate void InvokeOtherThead(int i);//委托
public InvokeOtherThead MainT//事件
public void WaitMoreTime()
for (int i= 0 ; i&20;i++)
Thread.Sleep(2000);
MainThread(i);//调用事件
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void button1_Click(object sender, EventArgs e)
MoreTime mt = new MoreTime();
mt.MainThread = new MoreTime.InvokeOtherThead(AddToList); //事件响应
ThreadStart start = new ThreadStart(mt.WaitMoreTime);//起动线程
Thread thread = new Thread(start);
thread.Start();
public void AddToList(int i)   //事件响应函数
if (this.listBox1.InvokeRequired)
MoreTime mt = new MoreTime();
mt.MainThread = new MoreTime.InvokeOtherThead(AddToList);
this.Invoke(mt.MainThread, new object[] { i});
listBox1.Items.Add(i.ToString());   //这里一定要是可以瞬时完成的函数
浏览: 47183 次
来自: 重庆
zhaoqj518 写道是啊,谁负责删除哪???谁负责创建,由 ...
是啊,谁负责删除哪???
# COperation* CCalculatorFactor ...
对于模式这方面的东西,, 我不大懂.. 不过一直有一个疑问:
声称说的话幽默是一种最不幽默的方式。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'C#子线程更新UI控件的方法实例总结
转载 & & 投稿:shichen2014
这篇文章主要介绍了C#子线程更新UI控件的方法,在桌面应用程序中控制UI界面有着不错的实用价值,需要的朋友可以参考下
本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值。分享给大家供大家参考之用。具体分析如下:
一般在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从子线程直接修改控件属性时会出现“从不是创建控件的线程访问它”的异常提示。
跨线程更新UI控件的常用方法有两种:
1.使用控件自身的invoke/BeginInvoke方法
2.使用SynchronizationContext的Post/Send方法更新
具体实现如下:
1.使用控件自身的invoke/BeginInvoke方法
Control类实现了ISynchronizeInvoke 接口,我们看该接口的定义:
Control类的invoke方法有两个实现
Object Invoke(Delegate); //在拥有此控件的基础窗口句柄的线程上执行指定的委托
Object Invoke(Delegate,Object[] );
可以看出继承Control类的UI控件都可以使用Invoke方法异步更新。以下代码段实现在子线程中更新Label控件的Text属性
private void button6_Click(object sender, EventArgs e)
Thread demoThread =new Thread(new ThreadStart(threadMethod));
demoThread.IsBackground =
demoThread.Start();//启动线程
void threadMethod()
Action&String& AsyncUIDelegate=delegate(string n){label1.Text=n;};/&span style="font-family: Arial, Helvetica, sans-"&/定义一个委托&/span&
label1.Invoke(AsyncUIDelegate,new object[]{"修改后的label1文本"});
2.使用SynchronizationContext的Post/Send方法更新
SynchronizationContext类在System.Threading命令空间下,可提供不带同步的自由线程上下文,其中Post方法签名如下:
public virtual void Post(SendOrPostCallback d,Object state)&&& //将异步消息调度到一个同步上下文
可以看出我们要异步更新UI控件,第一是要获取UI线程的上下文了,第二就是调用post方法了,代码实现:
SynchronizationContext _syncContext =
private void button6_Click(object sender, EventArgs e)
Thread demoThread =new Thread(new ThreadStart(threadMethod));
demoThread.IsBackground =
demoThread.Start();//启动线程
//窗体构造函数
public Form1()
InitializeComponent();
//获取UI线程同步上下文
_syncContext = SynchronizationContext.C
private void threadMethod()
_syncContext.Post(SetLabelText, "修改后的文本");//子线程中通过UI线程上下文更新UI
private void SetLabelText(object text)
this.lable1.Text = text.ToString();
希望本文所述对大家的C#程序设计有所帮助
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 android子线程更新ui 的文章

 

随机推荐