bug:C#線程間操作無效: 從不是創建控件" XX" 的線程訪問它


今天遇到這個問題,百度了下,把解決的方法總結出來。
我們在ui線程創建的子線程操作ui控件時,系統提示錯誤詳細信息為:
線程間操作無效: 從不是創建控件“XXX”的線程訪問它。

 

就我知道的有三種方法,先看一下msdn的介紹:

訪問 Windows 窗體控件本質上不是線程安全的。如果有兩個或多個線程操作某一控件的狀態,則可能會迫使該控件進入一種不一致的狀態。

還可能出現其他與線程相關的 bug,包括爭用情況和死鎖。確保以線程安全方式訪問控件非常重要。

 

看下解決辦法吧

1、把CheckForIllegalCrossThreadCalls設置為false

2、利用委托

delegate void SetTextCallBack(string text);
        private void SetText(string text)
        {
            if (this.InvokeRequired)//Control.InvokeReauqired判斷是否是創建控件線程,不是為true,則需要invoke到創建控件的線程,是就為false,直接操作控件
            {
                SetTextCallBack stcb = new SetTextCallBack(SetText);
                this.Invoke(stcb , new object[] { text});
            }
            else
            {
                this.txt_a.Text = text;
            }
        }
 
        private void LoadData()
        {
            SetText("測試");
        }
 
 
        //窗體加載時,用線程加載數據
        private void Frm_ImportManager_Load(object sender, EventArgs e)
        {
            ThreadStart ts = new ThreadStart(LoadData);
            Thread thread = new Thread(ts);
            thread.Name = "LoadData";
            thread.Start();
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM