winform BackgroundWorker的使用


要求異步進行

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)。

        }
    }
}
View Code

完!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM