C#完成跨線程操作控件辦法。本站提示廣大學習愛好者:(C#完成跨線程操作控件辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#完成跨線程操作控件辦法正文
本文實例講述了C#完成跨線程操作控件辦法,分享給年夜家供年夜家參考。詳細完成辦法以下:
因為在.net平台下Winform、wpf制止跨線程直接拜訪控件,是以在必需跨線程拜訪控件的時刻采取異步方法。
1、winform項目中跨線程拜訪控件:
編寫一個Winform小實例:在做winform項目中,有時為了將體系運轉的狀況及時顯示到Form中,是以添加一個RichTextbox控件及時顯示體系運轉日記。本例完成的操作是將日記以字符串的情勢寫入RichTextbox控件,由於是及時顯示,所以觸及到跨線程輸出的成績。
private delegate void setRichTexBox(string s);
public void setText(string txt)
{
if (this.t_revmsg.InvokeRequired)//期待異步
{
setRichTexBox fc = new setRichTexBox(Set);
this.Invoke(fc, new object []{ txt});
}
else
{
this.t_revmsg.AppendText(txt);
}
}
private void Set(string txt)
{
t_revmsg.AppendText(txt);
}
控件的InvokeRequired的值為true時,解釋有一個不屬於創立它的線程要拜訪它,此時須要采取異步的方法停止操作。
2、wpf項目中跨線程拜訪控件:
wpf的page頁中,參加一個button控件和textbox控件,點擊button完成添加textbox控件中的內容。
private void button2_Click(object sender, RoutedEventArgs e)
{
this.textBox1.Dispatcher.Invoke(new WriteDelegate(WriteMethod), "asdf");
}
private delegate void WriteDelegate(string str);
private void WriteMethod(string str)
{
this.textBox1.AppendText(str);
}
3、wpf項目中跨線程獲得textbox控件中的內容
本實例完成的功效是:點擊button控件,開啟socket監聽辦事。監聽的端口須要從UI界面中的textbox中獲得,由於不是創立它的線程拜訪它,是以才有Dispatcher.Invoke異步操作。稍作彌補:在開啟監聽的進程中,有while(true)逝世輪回,將其直接放入到主線程都邑招致線程沒法正常停止下去,處理辦法是開啟一個新的線程來開啟監聽。
private void button1_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(new ThreadStart(StartServer));
thread.Start();
}
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;
}
}
}
總結:
由上述幾個實例可以看到跨線程挪用須要應用Invoke和BeginInvoke(臨時沒有效到),在一些請求其實不是很嚴厲的體系中,暫且以為兩者是可以通用的。感興致的同伙可以測試運轉一下。經由過程理論會收成的更多!
願望本文所述對年夜家的C#法式設計有所贊助。