Visual studio之C#跨線程調用UI控件


背景

當前串口通訊項目,多個線程需要同時利用richTextBoxMsg控件打印信息,直接調用會造成線程不安全,嚴重的時候會直接導致UI線程掛掉,因此本篇就跨線程調用UI控件做個記錄。

正文

  • 定義控件的委托類型
// 提示界面控件的委托類型
delegate void ShowInfoCallback(string text, bool handle);
  • 定義操作該控件的函數
//該函數會在非創建UI控件的線程調用下,進行委托,由UI線程進行操作UI控件;
//若該函數由創建該UI控件的線程調用,則直接進行操作。
// handle 為 true,則為控件使用.text;為false,則控件使用.Appendtext
private void Showinfo(string text, bool handle)
{
        if (this.richTextBoxMsg.InvokeRequired)
        {   //若是創建控件的線程與調用該函數的線程不是同一個線程則進入
            while (!this.richTextBoxMsg.IsHandleCreated)
            {
                if (this.richTextBoxMsg.Disposing || this.richTextBoxMsg.IsDisposed)
                {// 解決窗體關閉時出現“訪問已釋放句柄的異常”
                    return;
                }
             }
             ShowInfoCallback d = new ShowInfoCallback(Showinfo);
             this.richTextBoxMsg.Invoke(d, new object[] { text, handle });
        }
        else
        {
            if(handle == true)
            {
                this.richTextBoxMsg.Text = text;
            }
            else
            {
                this.richTextBoxMsg.AppendText(text);
             }
                
        }
}
  • 調用方法
    直接調用即可。

至此記錄完畢。

參考鏈接

記錄時間:2017-05-25
記錄地點:江蘇淮安


免責聲明!

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



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