創作內容

6 GP

C# 執行緒 Thread的用法 #2

作者:貓貓風 ฅ●ω●ฅ│2017-01-17 22:15:45│巴幣:12│人氣:5333
.















之前提到的執行緒是使用backgroundworker,詳細可以參考前面的文章
這篇主要為執行緒的另外一種方法,如果在執行緒中刷UI會依樣遇到執行緒衝突的問題,跟backgroundworker刷UI的方式不太相同,這邊是使用 invoke來調用Callback函數來刷新,原理為將執行緒導回UI執行緒,因為機制關係不允許在其他執行緒中操作UI
以下為範例程式
此程式主要是使用一個無限迴圈來不斷的累加數字,直到使用者按暫停為止
 
using System;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
usingSystem.Windows.Forms;
usingSystem.Threading;
namespacethread_test2
{
        public partial class Form1 : Form
        {
         Thread _th; //宣告執行緒
                public Form1()
                {
                        InitializeComponent();
                }
                //委派 UpdateUICallBack 來更新UI
                private delegate voidUpdateUICallBack_Text(int value, Control ctl);
                private delegate void UpdateUICallBack_Label(stringvalue, Control ctl);   
                private voidbutton1_Click(object sender, EventArgs e)
                {
                        Update_Label("start",label1); //更新Label
                        _th = newThread(ExecuteInForeground);  
                       //宣告新執行緒做指定動作
                        _th.Start(); //開啟執行緒
                        //Thread.Sleep(1000);
                }
                private  void ExecuteInForeground()
                {
                 int i=0;
                        while (true)
                        {
                          i++;
                          Update_Text(i,textBox1); //更新textBox
                        }
                }
                private void Update_Text(intvalue, Control ctl)  
                {
                 try{
                          //判斷這個TextBox的物件是否在同一個執行緒上
                          //InvokeRequiredtrue時,表示在不同的執行緒上,所以進        
                          //行委派
                        if (this.InvokeRequired)
                        {
                                UpdateUICallBack_Textuu = new
                                UpdateUICallBack_Text(Update_Text);
                                this.Invoke(uu,value, ctl);
                        }
                        Else
                       //表示在同一個執行緒上了,所以可以正常的呼叫到這個TextBox物件
                        {
                                ctl.Text =value.ToString();
                        }
                   }
                   catch
                   {
                       MessageBox.Show("執行緒被關閉");
                   }
                }
                private void Update_Label(stringvalue, Control ctl)
                {
                        if (this.InvokeRequired)
                        {
                                UpdateUICallBack_Labeluu = new
                                UpdateUICallBack_Label(Update_Label);
                                this.Invoke(uu,value, ctl);
                        }
                        else
                        {
                                ctl.Text =value.ToString();
                        }
                }
                private voidbutton2_Click(object sender, EventArgs e)
                {
                        Update_Label("stop",label1);
                        _th.Abort(); //停止執行緒
                }
        }
}
開啟



暫停


引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3451015
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:涼涼風

留言共 1 篇留言

鈤守&鈅狐
跟我用的方法一樣呢~~~ >ω<

01-19 22:44

貓貓風 ฅ●ω●ฅ
感覺這比較難@A@01-19 22:56
我要留言提醒:您尚未登入,請先登入再留言

6喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:C# 列舉(enum) ... 後一篇:C# 執行緒帶參數方法...

追蹤私訊切換新版閱覽

作品資料夾

ilove487奇幻小說連載中
《克蘇魯的黎明》0671.蛇人第一王國伐盧希亞看更多我要大聲說1小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】