先看一個小例子:C#客戶端打開一個控件,控件中加載了好多數據大約要用5秒中,如果我們直接打開控件,那么這個控件就要5秒中才能彈出來,當然這個時候用戶已經把他Kill了。這個時候我們就需要先給用戶把控件UI加載出來,給出來一個假象,然后數據在后臺加載就OK了。具體看一下怎么做。
1 public Form1() 2 { 3 InitializeComponent(); 4 5 //如果要設置進度條和取消事件,則必須先設定他們的屬性可以執行 6 backgroundWorker1.WorkerReportsPRogress=true; 7 backgroundWorker1.WorkerSupportsCancellation=true; 8 9 //注冊要執行的耗時事件10 backgroundWorker1.DoWork += backgroundWorker1_DoWork;11 //注冊進度條事件12 backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;13 //注冊執行完backgroundworker事件14 backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;16 } 17 18 /// <summary>19 /// 點擊開始20 /// </summary>21 /// <param name="sender"></param>22 /// <param name="e"></param>23 private void startAsyncButton_Click(object sender, EventArgs e)24 {25 //這里做判斷就是判斷backgroundWorker是否在執行,如果沒有在執行就開始工作,執行Dowork中的事件26 if (!backgroundWorker1.IsBusy)27 {28 backgroundWorker1.RunWorkerAsync();29 }30 }31 32 /// <summary>33 /// 開始執行耗時事件34 /// </summary>35 /// <param name="sender"></param>36 /// <param name="e"></param>37 private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)38 {39 BackgroundWorker worker = sender as BackgroundWorker;40 for (int i = 1; i <= 10; i++)41 {42 if (worker.CancellationPending)43 {44 e.Cancel = true;45 break;46 }47 else48 {49 Thread.Sleep(500);50 //更改進度條值,觸發進度條事件,這里不能實現UI代碼,要在進度條改變事件里實現51 worker.ReportProgress(i * 10);52 }53 }54 }55 56 /// <summary>57 /// 點擊取消執行事件58 /// </summary>59 /// <param name="sender"></param>60 /// <param name="e"></param>61 private void cancelAsyncButton_Click(object sender, EventArgs e)62 {63 if (backgroundWorker1.WorkerSupportsCancellation == true)64 {65 // Cancel the asynchronous Operation.66 backgroundWorker1.CancelAsync();67 }68 }69 70 71 /// <summary>72 /// 進度條改變事件73 /// </summary>74 /// <param name="sender"></param>75 /// <param name="e"></param>76 private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)77 {78 radLabel1.Text = (e.ProgressPercentage.ToString() + "%");79 }80 81 /// <summary>82 /// backgroundWorker1執行完事件83 /// </summary>84 /// <param name="sender"></param>85 /// <param name="e"></param>86 private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)87 {88 }89 }具體代碼如下:
運行結果:
新聞熱點
疑難解答