zoukankan      html  css  js  c++  java
  • 【转贴】backgroundworker传递参数,backgroundworker实现进度条显示实例

    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
  • 相关阅读:
    Direct hosting of SMB over TCP/IP
    学习 Linux,302(混合环境): 概念
    脚本
    linux加入windows域
    Internet传输协议-TCP
    vCenter Single Sign On 5.1 best practices
    Zoning and LUN Masking
    Fiber Channel SAN Storage
    How to check WWN and Multipathing on Windows Server
    在Windows中监视IO性能
  • 原文地址:https://www.cnblogs.com/cappuccino/p/1977620.html
Copyright © 2011-2022 走看看