實現 winform 異步跨線程訪問UI控件

??????? 在開發winform時經常會用到多線程防止界面出現假死現象,比如當你單擊某個按鈕時,需要執行很多代碼,但是在執行過程中想實時的將當前執行的情況報告給用戶,類型進度條或文本什么的。

這個時候很顯然,如果你把要實現的內容放在按鈕方法里時,其實界面要等這個按鈕執行完后才能輸出來,這個時候就達不到我們的預期了;那么怎么才能解決問題呢。

我初略終結了一下有以下幾種方法:

??? 1.采用BackgroundWorker控件,這個控件將要實時輸出的內容寫在事件中;

 1 private void button1_Click(object sender, EventArgs e)
 2         {
 3             //異步執行邏輯
 4             backgroundWorker1.RunWorkerAsync();
 5         }
 6         private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
 7         {
 8             //實現業務邏輯
 9             int i = 5;
10             i = Math.Abs(i);
11             //報告當前處理進度
12             backgroundWorker1.ReportProgress(50);
13         }
14 
15         private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
16         {
17             //當前進度
18             int cuur = e.ProgressPercentage;
19             //實現跨線程控件的輸出
20             this.label1.Text = cuur.ToString();
21         }
22 
23         private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
24         {
25             //執行完畢可以報告信息
26             this.label1.Text = "ok";
27         }

?? 2.采用委托的方式實現靈活引用Invoke;

 1         private void button2_Click(object sender, EventArgs e)
 2         {
 3             //異步執行邏輯
 4             Thread thread = new Thread(ThreadFunc);
 5             thread.IsBackground = true;
 6             thread.Start();
 7         }
 8         private void ThreadFunc()
 9         {
10             //實現業務邏輯
11             int i = 5;
12             i = Math.Abs(i);
13             //報告當前處理進度
14             SetLabel(i.ToString());
15         }
16         //定義委托
17         delegate void SetLabelHandler(string text);
18         //實現方法
19         private void SetLabel(string text)
20         {
21             if (InvokeRequired)
22             {
23                 Invoke(new SetLabelHandler(SetLabel), text);
24             }
25             else
26             {
27                 this.label1.Text = text;
28             }
29         }

  3.采用Lamada表達式動態實現委托調用。

 1         private void button3_Click(object sender, EventArgs e)
 2         {
 3             //異步執行邏輯
 4             Thread thread = new Thread(Func);
 5             thread.IsBackground = true;
 6             thread.Start();
 7         }
 8         private void Func()
 9         {
10             //實現業務邏輯
11             int i = 5;
12             i = Math.Abs(i);
13             //報告當前處理進度
14             AsyncUI(() => { label1.Text = i.ToString(); });
15         }
16         public void AsyncUI(Action action)
17         {
18             if (InvokeRequired)
19             {
20                 Invoke(action);
21             }
22             else
23             {
24                 action();
25             }
26         }

?

以上是我總結的三種,至于有沒有其他方法,歡迎大家來拍磚,在這里我想推薦的是第三種方法,這個方法最靈活。

下面來談談我對這三種的看法:

對應第一種方法:使用簡單,拖控件就ok,但是對應需要顯示更負責的數據時比較麻煩;

對應第二種方法:可以不用拖控件來自由定制,但是同第一種方法一樣,如果需要顯示更多控件數據,也要定義很多方法和委托,太冗余累贅;

對于第三種方法:我個人非常喜歡,代碼在需要的時候動態使用,但是我也沒有仔細分析該方法的性能問題。

?

?

轉載于:https://www.cnblogs.com/steven_jiangxf/archive/2013/05/09/steven.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376682.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376682.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376682.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript對象的創建總結

方式 缺點 優點 基于已有對象擴充屬性和方法 不可重用,沒有約束 無 工廠方法 檢測不出是什么的實例 簡單封裝,可以傳參 構造方法 每創建一個對象就有開辟存放方法的空間 能通過instanceof檢測出實例類型,可以傳參 原型方式 不能…

從WebRtc學習RTP協議

文章目錄TCP為何不適用于實時音視頻UDP->RTPRTP協議結構JittbufferRTP擴展頭RTP填充數據參考TCP為何不適用于實時音視頻 可靠性是以犧牲實時性為代價的。按照TCP原理,當出現極端網絡情況時,理論上每個包的時延可達到秒級以上,而且這種時延…

我的第一個android應用上架,紀念一下

好久沒有寫博客了,最近一直在忙著弄自己的“汽車小助手“http://www.mumayi.com/android-318299.html軟件,終于在今天上架了,盡管今天的廣告收入只有5毛,寫個博客紀念一下。里面嵌入了萬普平臺的廣告,大家都懂得。一天…

內核態與用戶態【轉載】

原文:http://blog.csdn.net/skywalkzf/article/details/5185442 內核態與用戶態是操作系統的兩種運行級別,intel cpu提供Ring0-Ring3三種級別的運行模式。Ring0級別最高,Ring3最低。其中特權級0(Ring0)是留給操作系統代…

解決ListView異步加載數據之后不能點擊的問題

在ListView的onScroll事件中執行異步加載數據,然后使用notifyDataSetChange()函數更新適配器,之后發現listView不能點擊了,這問題苦惱了我半天。最后在一篇博文中發現調用listView的requestFocusFromTouch()函數終于解決了這問題。 Java代碼…

從WebRtc學習RTCP協議

文章目錄RTCP支持的消息類型RTCP協議頭WebRTC的反饋報文RTPFB支持的報文類型:PSFB支持的報文類型:參考RTCP是RTP的控制協議.那么RTCP能對RTP做哪些控制呢?其中最為大家熟知的就是 丟包控制。發送端發送數據后,接收端如果發現有RTP…

白話經典算法系列之中的一個 冒泡排序的三種實現

冒泡排序是很easy理解和實現,,以從小到大排序舉例: 設數組長度為N。 1.比較相鄰的前后二個數據,假設前面數據大于后面的數據,就將二個數據交換。 2.這樣對數組的第0個數據到N-1個數據進行一次遍…

如何用java代碼讓android Market顯示指定的程序以便用戶下載?

Uri uri Uri.parse("market://search?q名稱");Intent i new Intent("Intent.ACTION_VIEW", uri);startActivity(i);//根據應用程序ID應用程序的包名Uri urii Uri.parse("market://details?idcom.xiaoqiu.test");Intent ii new Intent(&quo…

無鎖隊列設計思路以及簡要代碼

文章目錄非并發的一寫一讀環形隊列多讀多寫環形隊列非并發的一寫一讀環形隊列 讀指針: 1、先判斷是否有數據 2、讀取數據 3、操作指針 寫指針: 1、先判斷空間是否足夠 2、寫入數據 3、操作指針 所以代碼也十分簡單: bool putqueue(void* pDa…

vs 2012,vs 2013問題系列

系統環境: 64位 win7 1,問題: 之前能連接tfs進行源碼管理,期間有改過本地電腦的時間,再后來使用vs 2012連接tfs卻失敗了。錯誤碼:TF31002。排除了網絡問題,用戶權限問題,tfs服務器問…

Linux查看系統信息的一些命令

轉:http://www.cnblogs.com/chenwenbiao/archive/2011/07/18/2109983.html 系統 # uname -a # 查看內核/操作系統/CPU信息 # head -n 1 /etc/issue # 查看操作系統版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看計…

CPU Cache對于并發編程的影響

文章目錄引子CPU Cache對于并發的影響讀寫順序對性能的影響字節對齊對Cache的影響小結引子 下面給出兩個極其相似的代碼&#xff0c;運行出的時間卻是有很大差別&#xff1a; 代碼一 #include <stdio.h> #include <pthread.h> #include <stdint.h> #includ…

textarea 在瀏覽器中固定大小和禁止拖動

http://blog.sina.com.cn/s/blog_641d569301011naz.html HTML 標簽 textarea 在大部分瀏覽器中只要指定行&#xff08;rows&#xff09;和列&#xff08;cols&#xff09;屬性&#xff0c;就可以規定 textarea 的尺寸&#xff0c;大小就不會改變&#xff0c;不過更好的辦法是使…

hibernate操作時報錯

報錯&#xff1a;[ERROR] AbstractBatcher Exception executing batch: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1原因&#xff1a;視具體情況而定&#xff0c;我這邊是代碼被修改過…

bugfix:MySQL內存使用率無限增長以及kill手法

問題&#xff1a;昨天mysql 宕機了一次&#xff0c;重啟&#xff0c;然后繼續運行業務代碼的時候發現問題&#xff0c;mysql內存占用率上升較快&#xff0c;于是搜了搜&#xff0c;遇到一個&#xff1a; http://blog.itpub.net/29510932/viewspace-2129312/ 根據思路&#xff0…

軟工之初識

我們之前已經在完全不懂軟件工程的情況下&#xff0c;已經做完了兩個小系統&#xff0c;雖然能夠運行&#xff0c;但其中有很多的問題&#xff0c;學習軟工就是讓我們在工程學原理的指導之下去開發和設計軟件。 軟件工程同大多數書講的都是一樣的&#xff0c;首先對軟件工程有一…

perf +火焰圖使用

以mysqld進程為例&#xff1a; [rootVM-90-225-centos ~]# ps -ef | grep mysqld root 9808 9621 0 19:30 pts/7 00:00:00 grep --colorauto mysqld root 16104 1 0 17:30 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir/usr/loc…

Mysql 遇到的編碼問題。

今天幫小朋友做一個項目&#xff0c;碰到一個挺搞的問題。在幫她安裝mysql的時候一直是next&#xff0c;沒有去注意一些細節&#xff0c;不曉得有沒有漏掉設置編碼那一部分。。 結果在用sql文件導入數據庫MySQL -h localhost -u root -p xxx < e:\xxx.sql 執行的時候錯誤提…

在一個字符串中找到第一個只出現一次的字符

題目&#xff1a;在一個字符串中找到第一個只出現一次的字符&#xff0c;如輸入abaccdeff&#xff0c;則輸出b&#xff1b;具體實現如下&#xff1a;#include <iostream> #include <string> using namespace std; void FindChar(const string &strBuf) {int nA…

py腳本:獲取進程信息

這里以mysqld進程為例子 # pip install psutil import psutil import time import re, sys# x:進程name y:非進程name # 由于這里監控的是mysqld&#xff0c;如果不加限制的話會先識別mysqld_safe&#xff0c;所以要加上mysql_safe的判別 def processinfo(x, y):p_list psut…