程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#完成跨線程操作控件辦法

C#完成跨線程操作控件辦法

編輯:C#入門知識

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#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved