zoukankan      html  css  js  c++  java
  • C# winform进度条 (异步)

    进度条页面:

     http://www.cnblogs.com/Deckard/archive/2009/06/24/1510451.html

    //===============================================================================
    // Microsoft patterns & practices
    // CompositeUI Application Block
    //===============================================================================
    // Copyright ?Microsoft Corporation.  All rights reserved.
    // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
    // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
    // LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
    // FITNESS FOR A PARTICULAR PURPOSE.
    //===============================================================================

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


    namespace BackgroudWokerUI
    {
        public partial class ProgressForm : Form
        {
            public ProgressForm()
            {
                InitializeComponent();
            }

            //工作完成后执行的事件
            public void OnProcessCompleted(object sender, EventArgs e)
            {
                this.Close();
            }

            //工作中执行进度更新
            public void OnProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                progressWork.Value = e.ProgressPercentage;
            }

            private void btnClose_Click(object sender, EventArgs e)
            {
                Close();
            }
        }
    }

    主页面:

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

    //Note You must be careful not to manipulate any user-interface objects
    //in your System.ComponentModel.BackgroundWorker.DoWork event handler.
    //Instead, communicate to the user interface through the
    //System.ComponentModel.BackgroundWorker.ProgressChanged and
    //System.ComponentModel.BackgroundWorker.RunWorkerCompleted events.

    namespace BackgroudWokerUI
    {
        public partial class MainForm : Form
        {
            //BindingList is useful list for UI
            private IList<string> leftList = new BindingList<string>();
            private IList<string> rightList = new BindingList<string>();

            private BackgroundWorker worker = null;

            public MainForm()
            {
                InitializeComponent();
                //Databinding here
                listBox1.DataSource = leftList;
                listBox2.DataSource = rightList;
            }

            private void addButton_Click(object sender, EventArgs e)
            {
                if (textBox.Text.Length != 0)
                {
                    leftList.Add(textBox.Text);
                    textBox.Text = "";
                    textBox.Focus();
                }
            }

            private void moveButton_Click(object sender, EventArgs e)
            {
                //显示进度条
                ProgressForm progressForm = new ProgressForm();
                progressForm.Show();

                // Prepare the background worker for asynchronous prime number calculation
                //准备进度条的记数
                worker= new BackgroundWorker();
                // Specify that the background worker provides progress notifications 
                //指定提供进度通知
                worker.WorkerReportsProgress = true;
                // Specify that the background worker supports cancellation
                //提供中断功能
                worker.WorkerSupportsCancellation = true;
                // The DoWork event handler is the main work function of the background thread
                //线程的主要功能是处理事件
                //开启线程执行工作
                worker.DoWork += new DoWorkEventHandler(worker_DoWork);
                // Specify the function to use to handle progress
                //指定使用的功能来处理进度
                worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
                worker.ProgressChanged += new ProgressChangedEventHandler(progressForm.OnProgressChanged);
                // Specify the function to run when the background worker finishes
                // There are three conditions possible that should be handled in this function:
                // 1. The work completed successfully
                // 2. The work aborted with errors
                // 3. The user cancelled the process
                //进度条结束完成工作
                //1.工作完成
                //2.工作错误异常
                //3.取消工作
                worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
                worker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(progressForm.OnProcessCompleted);
                    
                //If your background operation requires a parameter,
                //call System.ComponentModel.BackgroundWorker.RunWorkerAsync
                //with your parameter. Inside the System.ComponentModel.BackgroundWorker.DoWork
                //event handler, you can extract the parameter from the
                //System.ComponentModel.DoWorkEventArgs.Argument property.
                //如果进度条需要参数
                //调用System.ComponentModel.BackgroundWorker.RunWorkerAsync
                //传入你的参数至System.ComponentModel.BackgroundWorker.DoWork
                //提取参数
                //System.ComponentModel.DoWorkEventArgs.Argument
                worker.RunWorkerAsync(leftList);
            }

            //单线程执行工作
            private void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                MoveList((BackgroundWorker)sender,e);
            }

            //进行转移工作
            private void MoveList(BackgroundWorker worker,DoWorkEventArgs e)
            {
                IList<string> list = e.Argument as IList<string>;

                for (int i = 0; i < list.Count; i++)
                {
                    // Check for cancellation
                    //检查取消
                    if (worker.CancellationPending)
                    {
                        e.Cancel = true;
                        break;
                    }
                    else
                    {
                        // This will be handled in the correct thread thanks to the
                        // internals of BackgroundWroker and AsyncOperation
                        worker.ReportProgress((i + 1) * (100 / list.Count), list[i]);
                        // Simulate some time consuming proccess.
                        //线程休眠
                        Thread.Sleep(500);
                    }
                }
            }
            //添加数据至右边listBox
            private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                //Add string to the right listBox
                rightList.Add(e.UserState as string);
            }

            //工作完成状态
            private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if (e.Cancelled)
                {
                    label.Text = "Cancelled!取消";
                }
                else if (e.Error != null)
                {
                    label.Text = "Error!异常";
                }
                else
                {
                    label.Text = "Success!完成";
                    leftList.Clear();
                }
            }
            //取消中
            private void cancelButton_Click(object sender, EventArgs e)
            {
                if (worker.IsBusy)
                {
                    label.Text = "Cancelling...";
                    //挂起进程
                    worker.CancelAsync();
                }
            }
            //返回操作
            private void moveBackButton_Click(object sender, EventArgs e)
            {
                foreach (string str in rightList)
                {
                    leftList.Add(str);
                }
                rightList.Clear();
            }
        }
    }

  • 相关阅读:
    样式表中!important的用法
    ORA27101: shared memory realm does not exist问题的解决
    重置标识列的当前值
    ASP.NET Oracle数据库使用事务时注意事项
    Oracle中约束的添加方法总结
    HTML段落自动换行的样式设置
    ASP.NET应用程序中的服务器错误
    oracle中的rownum、order by与分页
    position:relative与float的区别
    Moss/Sharepoint 备份或还原时出错的处理(持续更新)
  • 原文地址:https://www.cnblogs.com/Nina-piaoye/p/3223148.html
Copyright © 2011-2022 走看看