本文實例講述了C#實現(xiàn)跨線程操作控件方法,分享給大家供大家參考。具體實現(xiàn)方法如下:
由于在.net平臺下Winform、wpf禁止跨線程直接訪問控件,因此在必須跨線程訪問控件的時候采用異步方式。
1、winform項目中跨線程訪問控件:
編寫一個Winform小實例:在做winform項目中,有時為了將系統(tǒng)運行的狀態(tài)實時顯示到Form中,因此添加一個RichTextbox控件實時顯示系統(tǒng)運行日志。本例實現(xiàn)的操作是將日志以字符串的形式寫入RichTextbox控件,因為是實時顯示,所以涉及到跨線程輸入的問題。
private void Set(string txt)
{
t_revmsg.AppendText(txt);
}
控件的InvokeRequired的值為true時,說明有一個不屬于創(chuàng)建它的線程要訪問它,此時需要采用異步的方式進行操作。
2、wpf項目中跨線程訪問控件:
wpf的page頁中,加入一個button控件和textbox控件,點擊button實現(xiàn)添加textbox控件中的內(nèi)容。
private delegate void WriteDelegate(string str);
private void WriteMethod(string str)
{
this.textBox1.AppendText(str);
}
3、wpf項目中跨線程獲取textbox控件中的內(nèi)容
本實例實現(xiàn)的功能是:點擊button控件,開啟socket監(jiān)聽服務(wù)。監(jiān)聽的端口需要從UI界面中的textbox中獲取,因為不是創(chuàng)建它的線程訪問它,因此才有Dispatcher.Invoke異步操作。稍作補充:在開啟監(jiān)聽的過程中,有while(true)死循環(huán),將其直接放入到主線程都會導(dǎo)致線程無法正常進行下去,解決方法是開啟一個新的線程來開啟監(jiān)聽。
public void StartServer()
{
int port = Convert.ToInt32(GetText(this.tbPort));
ServerSocket serverSocket = new ServerSocket(port);
serverSocket.Start();
}
private delegate string GetTextHandle(Control control);
private string GetText(Control control)
{
if (this.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
{
return (string)this.Dispatcher.Invoke(new GetTextHandle(this.GetText), control);
}
else
{
if (control.GetType() == typeof(TextBox))
{
return ((TextBox)control).Text;
}
else
{
return string.Empty;
}
}
}
總結(jié):
由上述幾個實例可以看到跨線程調(diào)用需要使用Invoke和BeginInvoke(暫時沒有用到),在一些要求并不是很嚴(yán)格的系統(tǒng)中,暫且認為二者是可以通用的。感興趣的朋友可以測試運行一下。通過實踐會收獲的更多!
希望本文所述對大家的C#程序設(shè)計有所幫助。
新聞熱點
疑難解答
圖片精選