C#进度条实现之异步实例是如何展示C#进度条实现的呢?让我们来看看:
C#进度条实现之异步实例进度条页面:
- //====================================
- // 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();
- }
- //工作中执行进度更新 ,C#进度条实现之异步实例
- public void OnProgressChanged(
- object sender, ProgressChangedEventArgs e)
- {
- progressWork.Value = e.ProgressPercentage;
- }
- private void btnClose_Click(object sender, EventArgs e)
- {
- Close();
- }
- }
- }
C#进度条实现之异步实例主页面:
- 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)
- {
- //显示进度条 ,C#进度条实现之异步实例
- 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
- //线程的主要功能是处理事件
- //开启线程执行工作 ,C#进度条实现之异步实例
- 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);
- }
- //C#进度条实现之异步实例
- //工作完成状态
- 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();
- }
- }
- }
C#进度条实现之异步实例的相关内容就向你介绍到这里,希望对你了解和学习C#进度条实现有所帮助。
【编辑推荐】