要求異步進行
1、設置
backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true;
2說明:
開始函數:
(1) backgroundWorker1.RunWorkerAsync(參數a),觸發DoWork事件,見參數a傳給事件的DoWorkEventArgs參數(用e.Argument接收參數)。
在dowork事件中進行函數體操作,在實踐中用ReportProgress(參數1,或者參數2)方法,將會觸發ProgressChanged事件
(2)在ProgressChanged事件中,ProgressChangedEventArgs參數可以接收ReportProgress()方法的兩個參數,然后進行相應的操作
(3)無論是中止還是終止BackgroundWorker線程。都會執行RunWorkerCompleted事件。
(4)所以,事件的順序是 backgroundWorker1.RunWorkerAsync(參數a)-->DoWork事件-->ProgressChanged事件-->RunWorkerCompleted事件.
3中止BackgroundWorker
用 backgroundWorker1.CancelAsync()方法,但是此時並沒有中止線程,只是將backgroundWorker1.CancellationPending改為true。此時需要在執行的事件中來判斷backgroundWorker1.CancellationPending的值進行終止操作。
4案例

using System; using System.ComponentModel; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApp27 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } private void Form1_Load(object sender, EventArgs e) { listView1.FullRowSelect = true; listView1.GridLines = true; listView1.Columns.Add("num"); listView1.Columns.Add("name"); listView1.Columns.Add("age"); listView1.Columns.Add("sex"); backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true; } public delegate void ShowList(int a); private void button1_Click(object sender, EventArgs e) { int num= string.IsNullOrEmpty(textBox1.Text) ? 5 : int.Parse(textBox1.Text); ; progressBar1.Maximum = num; button1.Enabled = false; backgroundWorker1.RunWorkerAsync(num);//引發backgroundWorker1_DoWork_1事件,將參數num以DoWorkEventArgs形式傳給事件 } private void ADD(object nm) { int num = int.Parse(nm.ToString()); for (int i = 0; i < num; i++) { ListViewItem li = new ListViewItem() { Text = i.ToString() }; li.SubItems.Add("name" + i); li.SubItems.Add("age" + i); li.SubItems.Add("sex" + i); listView1.Items.Add(li); } } private void backgroundWorker1_DoWork_1(object sender, DoWorkEventArgs e) { object oo = e.Argument;//獲取RunWorkerAsync()方法所傳遞的值 BackgroundWorker bw = sender as BackgroundWorker; int num = int.Parse(oo.ToString()); for (int i = 1; i <= num; i++) { if (bw.CancellationPending) {//判斷是否要求中止線程 e.Cancel = true; break;//很重要 } ListViewItem li = new ListViewItem() { Text = i.ToString() }; li.SubItems.Add("name" + i); li.SubItems.Add("age" + i); li.SubItems.Add("sex" + i); bw.ReportProgress(i,li);//觸發backgroundWorker1_ProgressChanged_1事件,將參數以ProgressChangedEventArgs格式傳給事件。此處的百分數解析並不准確,自己根基實際情況進行計算 Thread.Sleep(100); } } private void backgroundWorker1_ProgressChanged_1(object sender, ProgressChangedEventArgs e) { BackgroundWorker b = sender as BackgroundWorker; ListViewItem li = e.UserState as ListViewItem;//接收ReportProgress方法的第二個參數參數值 listView1.Items.Add(li); progressBar1.Value = e.ProgressPercentage;//接收ReportProgress方法的第一個參數參數值 label1.Text = (e.ProgressPercentage*100/progressBar1.Maximum).ToString(); } //無論是中止還是終止,都執行該事件 private void backgroundWorker1_RunWorkerCompleted_1(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show(e.Error.ToString()); } else if (e.Cancelled) { MessageBox.Show(e.Cancelled.ToString()); } else { MessageBox.Show("ok了"); } button1.Enabled = true; } private void button2_Click(object sender, EventArgs e) { backgroundWorker1.CancelAsync();//此處並不是真正的中止線程,只是將backgroundWorker1.CancellationPending的值設置成了true,需要在dowork事件(即所進行的操作的函數體中)進行判斷,再跳出函數(break)。 } } }
完!