創作內容

23 GP

C# 執行緒中更新UI方式

作者:貓貓風 ฅ●ω●ฅ│2018-10-17 10:47:41│巴幣:46│人氣:10144
.














在執行緒如果直接指定元件更新其內容時,都會跳出 "跨執行緒作業無效"

遇到此問題時的解訪有兩種

第一種是設定元件屬性

Form.CheckForIllegalCrossThreadCalls = False;

這樣就不會跳出上述問題,只是非常不建議使用此方式

程式執行時可能會出現很多無法預期的錯誤

=======================================================

第二種為正規的方式,使用委派來跨執行緒存取UI

詳細參考這篇 -> C# delegate update UI

實際的做法如下,隨意舉個簡單的例子

private delegate void UpdateUI( String str, Control ctl); //宣告委派

private void updateText( String str, Control ctl)
{
     if( this.InvokeReruired)
     {
        UpdateUI uu = new UpdateUI( updateText);
         this.Invoke( uu, str, ctl);
     }
     else
     {
          ctl.text = str;
      }
}

=======================================================

第三種方式就是使用 backgroundworker更新UI,範例如下

BackgroundWorker 元件請從工具箱中拖曳到UI上

可以點選屬性設定事件

詳細參考這篇 - > C# BackgroundWorker

private BackgroundWorker worker;

//初始化
private void init()
{
     worker= new BackgroundWorker();
     worker.WorkerReportsProgress = true;
     worker.WorkerSupportsCancellation = true;
     worker.DoWork += new DoWorkEventHandler(do_work);
     worker.ProgressChanged += new                         
     ProgressChangedEventHandler(worker_ProgressChanged);
     worker.RunWorkerCompleted += new     
     RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}

//背景執行
private void do_work(object sender, DoWorkEventArgs e)
{
  for(int i = 0 ; i < 60000 ; i++) //每秒讀取Sensor數值,持續60000次
  {
    read_Sensor_Data();
    Thread.sleep(1000);
    worker.ReportProgress(i);
  }
}
//如果中途按下取消鍵
private void end_Click(object sender, EventArgs e)
{
  if (worker.WorkerSupportsCancellation == true)
  {
    worker.CancelAsync();
  }
}
//處理進度條更新
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
     progressBar1.Value = e.ProgressPercentage / 60000 * 100;
     this.progress.Text = e.ProgressPercentage.ToString() + "%";
}
//讀取完畢
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   this.progress.Text = "read complete";
}






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

相關創作

同標籤作品搜尋:涼涼風|C#

留言共 8 篇留言

宇宙吃貨胖宅貓
不明覺厲喵

10-17 10:59

貓貓風 ฅ●ω●ฅ
[e43]10-17 11:06
彩゛天空゜
大叔風嘿嘿

10-17 12:49

貓貓風 ฅ●ω●ฅ
哭哭喵10-17 16:38
羽翼ˊ● ω ●ˋ
最近在學C,真的喵的機車

10-17 13:33

貓貓風 ฅ●ω●ฅ
不是很好玩嗎 OWO?10-17 16:38
小刀
厲害![e12]

10-17 15:49

貓貓風 ฅ●ω●ฅ
刀姊耶 好久不見10-17 16:38
Fuwawa
我的大腦短路ㄌ

10-17 21:03

貓貓風 ฅ●ω●ฅ
哪邊不懂呀 ><?10-17 23:25

我爬了兩百個網頁問題都解決完了,大神您怎麼才寫啊.......

10-17 22:56

貓貓風 ฅ●ω●ฅ
很早就寫啦 這篇算是整理@@10-17 23:25
囚鳥
習慣用第二種,第三種沒用過(?

10-19 14:36

貓貓風 ฅ●ω●ฅ
嚴格說起來 其實第三種比較簡單 也比較不需要Coding這麼多10-19 14:39
貓貓風 ฅ●ω●ฅ
是用現成的元件去做10-19 14:39
邊緣喵聖=3=
最近在用BackgroundWorker處理,受益良多

03-18 10:51

貓貓風 ฅ●ω●ฅ
很高興有幫到大大owo01-10 11:21
我要留言提醒:您尚未登入,請先登入再留言

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

前一篇:ShadowVerse ... 後一篇:C# 自訂Panel 樣...

追蹤私訊切換新版閱覽

作品資料夾

hyzgdivina喜歡虹咲的LLer
我的小屋裡有很多又香又甜的Hoenn繪師虹咲漫畫翻譯喔!歡迎LoveLiver來我的小屋裡坐坐~看更多我要大聲說昨天21:03


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

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