背景
當前串口通訊項目,多個線程需要同時利用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
記錄地點:江蘇淮安
