国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#實現跨線程操作控件方法

2019-10-29 21:42:35
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了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#程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梅州市| 达州市| 咸宁市| 塔城市| 潼南县| 涟源市| 马关县| 象州县| 晴隆县| 浦县| 全南县| 阿勒泰市| 紫金县| 靖宇县| 巴楚县| 万载县| 小金县| 桦川县| 梁平县| 平定县| 邵阳市| 轮台县| 山西省| 浦东新区| 成都市| 万宁市| 全南县| 潞城市| 武山县| 临桂县| 宝清县| 保定市| 静宁县| 寿阳县| 遂平县| 古浪县| 浦县| 遂昌县| 乌兰浩特市| 英吉沙县| 潍坊市|