久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

實(shí)現(xiàn) winform 異步跨線程訪問UI控件

 昵稱10504424 2013-07-16
在開發(fā)winform時(shí)經(jīng)常會(huì)用到多線程防止界面出現(xiàn)假死現(xiàn)象,比如當(dāng)你單擊某個(gè)按鈕時(shí),,需要執(zhí)行很多代碼,,但是在執(zhí)行過程中想實(shí)時(shí)的將當(dāng)前執(zhí)行的情況報(bào)告給用戶,類型進(jìn)度條或文本什么的,。
  2
  3 這個(gè)時(shí)候很顯然,,如果你把要實(shí)現(xiàn)的內(nèi)容放在按鈕方法里時(shí),其實(shí)界面要等這個(gè)按鈕執(zhí)行完后才能輸出來,,這個(gè)時(shí)候就達(dá)不到我們的預(yù)期了,;那么怎么才能解決問題呢。
  4
  5 我初略終結(jié)了一下有以下幾種方法:
  6
  7     1.采用BackgroundWorker控件,這個(gè)控件將要實(shí)時(shí)輸出的內(nèi)容寫在事件中,;
  8
  9
10  1 private void button1_Click(object sender, EventArgs e)
11  2         {
12  3             //異步執(zhí)行邏輯
13  4             backgroundWorker1.RunWorkerAsync();
14  5         }
15  6         private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
16  7         {
17  8             //實(shí)現(xiàn)業(yè)務(wù)邏輯
18  9             int i = 5;
19 10             i = Math.Abs(i);
20 11             //報(bào)告當(dāng)前處理進(jìn)度
21 12             backgroundWorker1.ReportProgress(50);
22 13         }
23 14
24 15         private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
25 16         {
26 17             //當(dāng)前進(jìn)度
27 18             int cuur = e.ProgressPercentage;
28 19             //實(shí)現(xiàn)跨線程控件的輸出
29 20             this.label1.Text = cuur.ToString();
30 21         }
31 22
32 23         private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
33 24         {
34 25             //執(zhí)行完畢可以報(bào)告信息
35 26             this.label1.Text = "ok";
36 27         }
37
38    2.采用委托的方式實(shí)現(xiàn)靈活引用Invoke,;
39
40
41  1         private void button2_Click(object sender, EventArgs e)
42  2         {
43  3             //異步執(zhí)行邏輯
44  4             Thread thread = new Thread(ThreadFunc);
45  5             thread.IsBackground = true;
46  6             thread.Start();
47  7         }
48  8         private void ThreadFunc()
49  9         {
50 10             //實(shí)現(xiàn)業(yè)務(wù)邏輯
51 11             int i = 5;
52 12             i = Math.Abs(i);
53 13             //報(bào)告當(dāng)前處理進(jìn)度
54 14             SetLabel(i.ToString());
55 15         }
56 16         //定義委托
57 17         delegate void SetLabelHandler(string text);
58 18         //實(shí)現(xiàn)方法
59 19         private void SetLabel(string text)
60 20         {
61 21             if (InvokeRequired)
62 22             {
63 23                 Invoke(new SetLabelHandler(SetLabel), text);
64 24             }
65 25             else
66 26             {
67 27                 this.label1.Text = text;
68 28             }
69 29         }
70
71   3.采用Lamada表達(dá)式動(dòng)態(tài)實(shí)現(xiàn)委托調(diào)用。
72
73
74  1         private void button3_Click(object sender, EventArgs e)
75  2         {
76  3             //異步執(zhí)行邏輯
77  4             Thread thread = new Thread(Func);
78  5             thread.IsBackground = true;
79  6             thread.Start();
80  7         }
81  8         private void Func()
82  9         {
83 10             //實(shí)現(xiàn)業(yè)務(wù)邏輯
84 11             int i = 5;
85 12             i = Math.Abs(i);
86 13             //報(bào)告當(dāng)前處理進(jìn)度
87 14             AsyncUI(() => { label1.Text = i.ToString(); });
88 15         }
89 16         public void AsyncUI(Action action)
90 17         {
91 18             if (InvokeRequired)
92 19             {
93 20                 Invoke(action);
94 21             }
95 22             else
96 23             {
97 24                 action();
98 25             }
99 26         }
100
101 
102
103 以上是我總結(jié)的三種,,至于有沒有其他方法,,歡迎大家來拍磚,在這里我想推薦的是第三種方法,,這個(gè)方法最靈活,。
104
105 下面來談?wù)勎覍?duì)這三種的看法:
106
107 對(duì)應(yīng)第一種方法:使用簡(jiǎn)單,拖控件就ok,,但是對(duì)應(yīng)需要顯示更負(fù)責(zé)的數(shù)據(jù)時(shí)比較麻煩,;
108
109 對(duì)應(yīng)第二種方法:可以不用拖控件來自由定制,但是同第一種方法一樣,,如果需要顯示更多控件數(shù)據(jù),,也要定義很多方法和委托,太冗余累贅,;
110
111 對(duì)于第三種方法:我個(gè)人非常喜歡,,代碼在需要的時(shí)候動(dòng)態(tài)使用,但是我也沒有仔細(xì)分析該方法的性能問題,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多