【转贴】backgroundworker传递参数,backgroundworker实现进度条显示实例

简介: backgroundworker传递参数,backgroundworker实现进度条显示实例 backgroundworker传递参数,backgroundworker实现进度条显示实例附一个简单的刷网页流量的小工具代码 1.
backgroundworker传递参数,backgroundworker实现进度条显示实例
backgroundworker传递参数,backgroundworker实现进度条显示实例
附一个简单的刷网页流量的小工具代码

1. 从工具栏拖一个BackgroundWorker控件,设置其属性WorkerReportsProgress为true

2. 要让worker开始工作,执行如下代码:
    mBackgroundWorker.RunWorkerAsync(arg);
    这里有重写,如果不需要传递参数直接mBackgroundWorker.RunWorkerAsync();

3. 编辑DoWork事件代码:
    e.Argument为mBackgroundWorker.RunWorkerAsync(arg);对应的参数
    之所以使用进度条,肯定是有循环的,在循环中报告进度:
    worker.ReportProgress(i * 100 / totalNum, obj );
    其中第一个参数是当前进度的百分之多少,obj为你要传递的UserState,如果没有可以不要

4. 编辑ProgressChanged事件代码:
    e.ProgressPercentage为进度的百分数,e.UserState为刚才传递过来的object
    在这个事件中可以调用ui的进度条和其他控件:
    mToolStripProgressBar.Value = e.ProgressPercentage;

5. 编辑RunWorkerCompleted事件代码:
    工作完成了告诉ui


示例代码:一个简单的刷网页流量的小工具

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;

namespace shua
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync(textBox1.Text);
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = (BackgroundWorker)sender;
            string url = e.Argument.ToString();
            int num = int.Parse(textBox2.Text);
            for (int i = 0; i < num; i++)
            {
                if (!worker.CancellationPending)
                {
                    WebRequest request = WebRequest.Create(url);
                    WebResponse response = request.GetResponse();
                    response.Close();
                   
                    Thread.Sleep(100);
                    worker.ReportProgress(i * 100 / num, i);
                }
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            label3.Text = e.UserState.ToString();
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("ok");
        }
    }
}
以上内容为网上找到,经本人测试后发现会出错:
此 BackgroundWorker 声明它不报告进度。请修改 WorkerReportsProgress 以声明它报告进度。

经测试发现要先声名它可以报告进度:
worker.WorkerReportsProgress = true;

 

来自: http://hi.baidu.com/sunnyzhishui/blog/item/52741a24a0b8473ac8955994.html
 
另外一个backgroundworker的文章: http://msdn.microsoft.com/zh-cn/dd441756.aspx
相关文章