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

首頁 > 學院 > 開發設計 > 正文

C#跨線程操作控件

2019-11-14 16:23:56
字體:
來源:轉載
供稿:網友

在看別人代碼的時候總是會Invoke和BeginInvoke方法,雖然大致明白是什么意思,但卻不能很好的使用,上網查了很多資料,剛巧看到自己求學期間轉載過一篇博文:

c#Invoke和BeginInvoke的區別

 博文中講的都是一些理論知識,本文介紹幾個常見的問題:

 .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(暫時沒有用到),在一些要求并不是很嚴格的系統中,暫且認為二者是可以通用的。(不知道對不?望高手指點一二)

目前為止,所接觸到的常見問題只有這些,以后遇到再補充吧。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乡宁县| 平遥县| 黎川县| 七台河市| 西乌| 龙南县| 栾川县| 永靖县| 乐清市| 遂川县| 建平县| 常宁市| 浦县| 玉屏| 普格县| 旬阳县| 玉环县| 吴桥县| 禄丰县| 沂源县| 庆城县| 闵行区| 河南省| 区。| 哈尔滨市| 东阿县| 沭阳县| 阿拉善左旗| 镇雄县| 榆林市| 米林县| 洛扎县| 永丰县| 阳山县| 城口县| 尉氏县| 南昌市| 周口市| 陆丰市| 扎兰屯市| 达拉特旗|