欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實(shí)現(xiàn)跨線程操作控件方法

 更新時(shí)間:2014年10月20日 09:30:12   投稿:shichen2014  
這篇文章主要介紹了C#實(shí)現(xiàn)跨線程操作控件方法,主要采用異步訪問方式實(shí)現(xiàn),需要的朋友可以參考下

本文實(shí)例講述了C#實(shí)現(xiàn)跨線程操作控件方法,分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:

由于在.net平臺(tái)下Winform、wpf禁止跨線程直接訪問控件,因此在必須跨線程訪問控件的時(shí)候采用異步方式。

1、winform項(xiàng)目中跨線程訪問控件:

編寫一個(gè)Winform小實(shí)例:在做winform項(xiàng)目中,有時(shí)為了將系統(tǒng)運(yùn)行的狀態(tài)實(shí)時(shí)顯示到Form中,因此添加一個(gè)RichTextbox控件實(shí)時(shí)顯示系統(tǒng)運(yùn)行日志。本例實(shí)現(xiàn)的操作是將日志以字符串的形式寫入RichTextbox控件,因?yàn)槭菍?shí)時(shí)顯示,所以涉及到跨線程輸入的問題。

復(fù)制代碼 代碼如下:
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時(shí),說明有一個(gè)不屬于創(chuàng)建它的線程要訪問它,此時(shí)需要采用異步的方式進(jìn)行操作。

2、wpf項(xiàng)目中跨線程訪問控件:

wpf的page頁中,加入一個(gè)button控件和textbox控件,點(diǎn)擊button實(shí)現(xiàn)添加textbox控件中的內(nèi)容。

復(fù)制代碼 代碼如下:
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項(xiàng)目中跨線程獲取textbox控件中的內(nèi)容

本實(shí)例實(shí)現(xiàn)的功能是:點(diǎn)擊button控件,開啟socket監(jiān)聽服務(wù)。監(jiān)聽的端口需要從UI界面中的textbox中獲取,因?yàn)椴皇莿?chuàng)建它的線程訪問它,因此才有Dispatcher.Invoke異步操作。稍作補(bǔ)充:在開啟監(jiān)聽的過程中,有while(true)死循環(huán),將其直接放入到主線程都會(huì)導(dǎo)致線程無法正常進(jìn)行下去,解決方法是開啟一個(gè)新的線程來開啟監(jiān)聽。

復(fù)制代碼 代碼如下:
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;
 }
    }
}

總結(jié):

由上述幾個(gè)實(shí)例可以看到跨線程調(diào)用需要使用Invoke和BeginInvoke(暫時(shí)沒有用到),在一些要求并不是很嚴(yán)格的系統(tǒng)中,暫且認(rèn)為二者是可以通用的。感興趣的朋友可以測試運(yùn)行一下。通過實(shí)踐會(huì)收獲的更多!

希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 使用c#實(shí)現(xiàn)隨機(jī)數(shù)猜數(shù)游戲的示例代碼

    使用c#實(shí)現(xiàn)隨機(jī)數(shù)猜數(shù)游戲的示例代碼

    這篇文章主要介紹了使用c#實(shí)現(xiàn)隨機(jī)數(shù)猜數(shù)游戲的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解C#之事件

    詳解C#之事件

    這篇文章主要介紹了C#之事件的知識(shí)點(diǎn),文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下
    2020-06-06
  • c#多線程網(wǎng)絡(luò)聊天程序代碼分享(服務(wù)器端和客戶端)

    c#多線程網(wǎng)絡(luò)聊天程序代碼分享(服務(wù)器端和客戶端)

    本程序使用VS2005 制作,程序分為三塊,XuLIeHua類庫下有我寫的把結(jié)構(gòu)序列化的類,還有就是服務(wù)器端和客戶端
    2013-12-12
  • 最新評(píng)論