在.NET 2.0应用程序中使用BackgroundWorker组件 实现进度条
来源:互联网 发布:vs上mpi编程 编辑:程序博客网 时间:2024/04/27 17:59
作者 Michael Livshitz 2007年7月3日
BackgroundWorker可以让窗体异步地完成一个操作。在我们需要执行诸如『数据库事务』或者『图片下载』之类的操作时,这个功能非常有用。此时,我们的可以让用户界面停止响应(或者隐藏起来直到操作结束)。在这篇文章中,我会一步一步教会你如何在.NET 2.0程序中使用BackgroundWorker组件以便处理较耗时的操作。示例程序使用C#编写。
与往常一样,我们创建一个测试工程,取名为"TestBGW",使之只包含一个窗体("FormBGW"):
图1.
我们将使用BackgroundWorker完成一些数据库的事务操作(比如,获取一些DataTable)。首先拖一个BackgroundWorker组件到我们窗体上。
图2.
我们将用DataTable来设置DataGridView1的DataSource属性。我们还应该刷新我们的用户界面,并告诉用户:所有的操作已经全部“OK”,他/她不用再操心啦。因此,我们还要需要一个StatusStrip和一个Timer.
图3.
为了让用户看到我们的处理过程正在运行之中,我们将用到toolStripProgressBar1:
图4.
用toolStripStatusLabel1和toolStripStatusLabelTime是来向用户显示处理过程的状态和已经花费的时间。
我们窗体看上去是这样子的:
图5.
为了模拟数据库的事务操作,我们将用到 GetData.dll(当然你也可以连接到一个真实的数据库;这个模拟的目的只是为了测试而已)。出于这个目的,我们把GetData.dll添加到引用中,然后写因getDataTable方法:
顺便说一句,如果仅仅为了测试ReportProgress如何工作,你可以给backgroundWorker1_DoWork方法加上下面的代码:
dataGridViewCities.DataSource = e.Result;
FormBGW.cs的全部代码如下:
using System; using System.Collections.Generic;
--------------
译者的话,这是我在译言翻译的第一篇。从我的角度讲,我是不赞同一个看不懂这篇文章原文的人做程序员的。不过我天生不爱放弃,既然接下了翻译任务,就完成了它吧。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace TestBGW
{
public partial class FormBGW : Form
{
DateTime startDate = DateTime.Now;
public FormBGW()
{
InitializeComponent();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
toolStripStatusLabel1.Text = "Loading ... " + "Thanks for your patience";
e.Result = this.ComputeFibonacci(40);
toolStripStatusLabel1.Text = "Please, wait ...";
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
toolStripProgressBar1.Value = 100;
toolStripStatusLabel1.Text = "";
toolStripProgressBar1.Value = 0;
timer1.Stop();
toolStripStatusLabelTime.Text = "";
}
private void timer1_Tick(object sender, EventArgs e)
{
TimeSpan ts = DateTime.Now.Subtract(startDate);
string sTime = " ..." + ts.Minutes.ToString("00") +
":" + ts.Seconds.ToString("00") +
":" + ts.Milliseconds.ToString("000");
toolStripStatusLabelTime.Text = sTime;
if (toolStripProgressBar1.Value == toolStripProgressBar1.Maximum)
{
toolStripProgressBar1.Value = 0;
}
toolStripProgressBar1.PerformStep();
}
private void FormBGW_Activated(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();//开始异步操作
timer1.Start();
}
private long ComputeFibonacci(int n)
{
// The parameter n must be >= 0 and <= 91.
// Fib(n), with n > 91, overflows a long.
if ((n < 0) || (n > 91))
{
throw new ArgumentException(
"value must be >= 0 and <= 91", "n");
}
long result = 0;
if (n < 2)
{
result = 1;
}
else
{
result = ComputeFibonacci(n - 1) +
ComputeFibonacci(n - 2);
}
return result;
}
}
}
- 在.NET 2.0应用程序中使用BackgroundWorker组件 实现进度条
- 在 .NET 2.0 中使用 BackgroundWorker 组件
- 使用BackgroundWorker组件 (进度条)
- 多线程:C#.NET中使用BackgroundWorker在模态对话框中显示进度条
- 多线程:C#.NET中使用BackgroundWorker在模态对话框中显示进度条
- 在BackGroundWorker中使用ArcGIS组件
- 在BackGroundWorker中使用ArcGIS组件
- backgroundworker使用 实现进度条ProgressBar
- backgroundworker使用 实现进度条ProgressBar
- 在COM应用程序中使用.NET组件
- 在.NET应用程序中不注册使用ocx Com组件
- BackgroundWorker实现进度条
- 在WPF 中使用 BackgroundWorker
- VS2005中BackgroundWorker组件的使用经验
- VS2005中BackgroundWorker组件的使用经验
- VS2005中BackgroundWorker组件的使用经验
- VS2005中BackgroundWorker组件的使用经验
- VS2005中BackgroundWorker组件的使用经验
- jQuery1.1 API 中文版 第一部分Core
- HTTP Compression
- Ajax-在Visual Studio中调试JavaScript
- 药品招投标查询系统
- (轉)DataGridView 控件结构(Windows 窗体)
- 在.NET 2.0应用程序中使用BackgroundWorker组件 实现进度条
- AJAX学习-1 Asp.net下Ajax的安装和配置
- Teach Yourself Visual C++ 6 in 21 Days(C++ 21天自学速成) 学习笔记
- Web2.1技术演示
- ***IBM*** 你知道多???
- Inversion of Control Containers and the Dependency Injection pattern
- 嵌入式linux下常见的文件系统
- ThinkPad BIOS设置手册
- IBM ThinkPad笔记本资料速查