小屋創作

日誌2018-10-17 10:47

C# 執行緒中更新UI方式

作者:貓貓風 ฅ●ω●ฅ

.














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

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

第一種是設定元件屬性

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";
}






23

8

LINE 分享

相關創作

碧藍航線 自動戰鬥腳本 v2.2.0 定向摺疊 - v2

碧藍航線 自動戰鬥腳本 v2.1.9 蒼閃忍法帖

碧藍航線 自動戰鬥腳本 v2.2.2 奏響鳶尾之歌

留言

開啟 APP

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

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