C#子线程更新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 = 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#程序设计有所帮助