当前位置: 移动技术网 > IT编程>开发语言>c# > C#子线程更新UI控件的方法实例总结

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
本文实例总结了c#子线程更新ui控件的方法,对于桌面应用程序设计的ui界面控制来说非常有实用价值。分享给大家供大家参考之用。具体分析如下: 一般在winform c/s程

本文实例总结了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 = true; 
   demothread.start();//启动线程 
} 
 
 void threadmethod() 
 {  
   action<string> asyncuidelegate=delegate(string n){label1.text=n;};/<span style="font-family: arial, helvetica, sans-serif;">/定义一个委托</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 = null; 
 
private void button6_click(object sender, eventargs e) 
{ 
  thread demothread =new thread(new threadstart(threadmethod)); 
  demothread.isbackground = true; 
  demothread.start();//启动线程 
} 
 
//窗体构造函数   
public form1() 
{ 
  initializecomponent(); 
   //获取ui线程同步上下文 
  _synccontext = synchronizationcontext.current; 
} 
 
private void threadmethod() 
{ 
   _synccontext.post(setlabeltext, "修改后的文本");//子线程中通过ui线程上下文更新ui 
} 
  
private void setlabeltext(object text) 
{ 
  this.lable1.text = text.tostring(); 
}

希望本文所述对大家的c#程序设计有所帮助

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网