詳情介紹c#中Winform實作多執行緒非同步更新UI的範例程式碼

黄舟
發布: 2017-03-21 11:18:42
原創
1874 人瀏覽過

本篇文章主要介紹了c#中Winform實作多執行緒非同步更新UI(進度及狀態資訊) ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

引言

在進行Winform程式開發需要進行大量的資料的讀寫操作的時候,往往會需要一定的時間,然在這個時段裡面,介面ui得不到更新,導致在使用者看來介面處於假死的狀態,造成了不好的使用者體驗。所以在大量資料操作的應用程式上,需要使用多執行緒來處理這種情況。在c#中使用多執行緒很方便只需要使用System.Threading.Thread的一個實例的Start方法就行了,但是如何實作多執行緒之間的互動就不是那麼簡單。本文實作了用子執行緒去處理數據,並且即時更新主執行緒的ui狀態了。下面就開始一步步的去實作非同步執行緒更新ui的demo程式吧。

應用背景

寫入一定量的資料到文字檔案中,同時需要在主介面中反應出寫入資料的即時進度。要求:需要將寫入資料封裝成一個類別。

實作過程

1、先建立一個winform項目,在主窗體上拖入一個button,一個progressbar,一個lable。如下圖所示。

2、寫一個處理資料的類別(WriteDate),原始碼如下。

 public class DataWrite
 {
  public delegate void UpdateUI(int step);//声明一个更新主线程的委托
  public UpdateUI UpdateUIDelegate;

  public delegate void AccomplishTask();//声明一个在完成任务时通知主线程的委托
  public AccomplishTask TaskCallBack;
  
  public void Write(object lineCount)
  {
   StreamWriter writeIO = new StreamWriter("text.txt", false, Encoding.GetEncoding("gb2312"));
   string head = "编号,省,市";
   writeIO.Write(head);
   for (int i = 0; i < (int)lineCount; i++)
   {
    writeIO.WriteLine(i.ToString() + ",湖南,衡阳");
    //写入一条数据,调用更新主线程ui状态的委托
    UpdateUIDelegate(1);
   }
   //任务完成时通知主线程作出相应的处理
   TaskCallBack();
   writeIO.Close();
  }
 }
登入後複製

3、主介面中的程式碼如下:

#首先要建立一個委託來實作非建立控制項的執行緒更新控制項。

delegate void AsynUpdateUI(int step);
登入後複製

然後寫多執行緒去啟動寫入資料的方法以及回呼的函數。

  private void btnWrite_Click(object sender, EventArgs e)
  {
   int taskCount = 10000; //任务量为10000
   this.pgbWrite.Maximum = taskCount;
   this.pgbWrite.Value = 0;

   DataWrite dataWrite = new DataWrite();//实例化一个写入数据的类
   dataWrite.UpdateUIDelegate += UpdataUIStatus;//绑定更新任务状态的委托
   dataWrite.TaskCallBack += Accomplish;//绑定完成任务要调用的委托

   Thread thread = new Thread(new ParameterizedThreadStart(dataWrite.Write));
   thread.IsBackground = true;
   thread.Start(taskCount);
  }

  //更新UI
  private void UpdataUIStatus(int step)
  {
   if (InvokeRequired)
   {
    this.Invoke(new AsynUpdateUI(delegate(int s)
    {
     this.pgbWrite.Value += s;
     this.lblWriteStatus.Text = this.pgbWrite.Value.ToString() + "/" + this.pgbWrite.Maximum.ToString();
    }), step);
   }
   else
   {
    this.pgbWrite.Value += step;
    this.lblWriteStatus.Text = this.pgbWrite.Value.ToString() + "/" + this.pgbWrite.Maximum.ToString();
   }
  }

  //完成任务时需要调用
  private void Accomplish()
  {
   //还可以进行其他的一些完任务完成之后的逻辑处理
   MessageBox.Show("任务完成");
  }
登入後複製

效果如下:

 

#總結

## 實作非同步更新ui有很多種方法,但是我認為這種方式是比較靈活,能即時的獲取到任務進行的狀態,並且對之進行相應的處理。這種模式也適用於使用多個執行緒同時寫入不同的資料到不同的檔案中去。

以上是詳情介紹c#中Winform實作多執行緒非同步更新UI的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板