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屬性
[csharp]?view plain?copy?
2.使用SynchronizationContext的Post/Send方法更新
SynchronizationContext類在System.Threading命令空間下,可提供不帶同步的自由線程上下文,其中Post方法簽名如下:
public virtual void Post(SendOrPostCallback d,Object state)??? //將異步消息調度到一個同步上下文
可以看出我們要異步更新UI控件,第一是要獲取UI線程的上下文了,第二就是調用post方法了,代碼實現:
[csharp]?view plain?copy原文鏈接:http://blog.csdn.net/smilefyx/article/details/47724911
總結
以上是生活随笔為你收集整理的C#子线程中更新ui的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自学Zabbix3.0版本以上资产清单i
- 下一篇: Arcgis API for JavaS