最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中跨線程訪問控件的實現方法

 更新時間:2024年12月10日 08:28:35   作者:小碼編匠  
C#中不允許跨線程直接訪問界面控件,即一個線程中如主線程創(chuàng)建的控件不允許被其他線程例如子線程直接訪問,在一個線程中設置其他線程所有的控件屬性通常有兩種方法,本文將詳細的給大家介紹一下,需要的朋友可以參考下

一、簡述

C#中不允許跨線程直接訪問界面控件,即一個線程中如主線程創(chuàng)建的控件不允許被其他線程例如子線程直接訪問,如果直接訪問或設置屬性則會爆出“調用線程無法訪問此對象,因為另一個線程擁有該對象”等類似錯誤。

在一個線程中設置其他線程所有的控件屬性通常有兩種方法,一是設置System.Windows.Forms.Control的CheckForIllegalCrossThreadCalls屬性值為false,表示不對錯誤線程的調用進行捕捉,這種方法只對winforms界面框架有效,在WPF中無法設置該屬性,只能使用第二種方法。

第二種方法是通過委托來實現控件屬性設置,需要通過InvokeBeginInvoke來實現,Invoke表示同步,BeginInvoke表示異步,下面列舉了在winforms中和WPF兩種界面框架中跨線程訪問控件的代碼示例。

二、Winforms中跨線程訪問控件

一般的委托方法示例代碼如下:

delegate void delegateSetText(string str);//定義一個委托
private void SetText(string str)
{
  if (InvokeRequired)//判斷是否是被其他線程調用
   {
       delegateSetText delegatesetText01 = new delegateSetText(SetText);
       Invoke(delegatesetText01, new object [] {str});
       return;
   }
   textBox01.Text = str;
}

也可以采用匿名代理的方式,示例代碼如下:

delegate void delegateSetText(string str);//定義一個委托
private void SetText(string str)
{
  delegateSetText delegatesetText01 = delegate(string str01)
   {
       textBox01.Text = str01;
   }
   Invoke(delegatesetText01, new object [] {str});
}

三、WPF中跨線程訪問控件

在WPF中跨線程訪問控件需要使用Dispatcher。Dispatcher是WPF中的線程調度管理器,用在子線程刷新主線程(UI線程)(比如綁定的時候,屬性更新的時候),在子線程里面起一個dispatcher,將工作項目調度到 UI 線程,讓主線程調度刷新UI的代碼。示例代碼如下:

private void SetText(string str)
{
  if (!Dispatcher.CheckAccess())//判斷是否是被其他線程調用
   {
       Dispatcher.Invoke(() => SetText(str));
       return;
   }
   textBox01.Text = str;
}

【注】

避免”在創(chuàng)建窗口句柄之前,不能在控件上調用 Invoke 或 BeginInvoke。“錯誤。

一個Form窗體必須完全創(chuàng)建完成,才能調用它自身或它上面控件的Invoke或BeginInvoke。

經測試,窗體的構造函數內的InitializeComponent()的執(zhí)行完成時,窗體并未創(chuàng)建完成;窗體的構造函數執(zhí)行完成時,窗體也并未創(chuàng)建完成;

在form.show()后,窗體是已經創(chuàng)建完成了。

另外,可以在調用Invoke()前,判斷一下 if (form.Created),以避免此處異常中斷。

最后

到此這篇關于C#中跨線程訪問控件的方法的文章就介紹到這了,更多相關C#跨線程訪問控件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#遞歸實現回文判斷算法

    C#遞歸實現回文判斷算法

    這篇文章主要介紹了C#遞歸實現回文判斷算法,方法簡單實用,需要的朋友可以參考下
    2014-10-10
  • C#中使用反射獲取結構體實例及思路

    C#中使用反射獲取結構體實例及思路

    一般用反射獲取類對象的實例比較簡單,只要類有一個無參構造函數或沒有顯示聲明帶參的構造函數即可使用
    2013-10-10
  • C#通過屬性名稱獲取(讀取)屬性值的方法

    C#通過屬性名稱獲取(讀取)屬性值的方法

    本文主要介紹了C#通過屬性名稱獲取(讀取)屬性值的方法,并提供了簡化版代碼,具有很好的參考價值,需要的朋友可以看下
    2016-12-12
  • c#預處理指令分析

    c#預處理指令分析

    這篇文章主要介紹了c#預處理指令的相關資料,幫助大家更好的理解和學習c#,感興趣的朋友可以了解下
    2020-08-08
  • 微信服務號推送模板消息接口

    微信服務號推送模板消息接口

    這篇文章主要介紹了微信服務號推送模板消息接口,需要的朋友可以參考下
    2015-08-08
  • c#中禁用windows的任務管理器的方法

    c#中禁用windows的任務管理器的方法

    這篇文章主要介紹了c#中禁用windows的任務管理器的方法,通過注冊表實現禁用,需要的朋友可以參考下
    2014-06-06
  • 解決WPF附加屬性的Set函數不調用的問題

    解決WPF附加屬性的Set函數不調用的問題

    這篇文章介紹了解決WPF附加屬性的Set函數不調用的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#中如何正確的使用字符串String

    C#中如何正確的使用字符串String

    這篇文章主要給大家介紹了關于在C#中如何正確的使用字符串String的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • C# GUID ToString的使用總結

    C# GUID ToString的使用總結

    這篇文章主要介紹了C# GUID ToString的使用總結,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#驗證碼問題的快速解決方法

    C#驗證碼問題的快速解決方法

    下面小編就為大家?guī)硪黄狢#驗證碼問題的快速解決方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07

最新評論

墨竹工卡县| 樟树市| 南和县| 城口县| 车致| 浦城县| 吴川市| 石柱| 山阴县| 玉环县| 荥经县| 闵行区| 韶山市| 自贡市| 河池市| 双流县| 长春市| 吉林省| 大荔县| 安岳县| 壶关县| 凭祥市| 寻乌县| 和静县| 陇川县| 万载县| 达孜县| 晋州市| 汉阴县| 南漳县| 喀喇沁旗| 泗洪县| 彭州市| 都安| 德保县| 定南县| 万州区| 凌海市| 彩票| 望城县| 朝阳市|