C# BackgroundWorker使用,以及vs进度条显示百分比
1:定义
private BackgroundWorker bw = new BackgroundWorker();
2:初始化设置
public ComparisonIMG()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
//后台工作初始化
bw.WorkerReportsProgress = true;//是否报告进度
bw.WorkerSupportsCancellation = true;//是否支持取消
bw.DoWork += new DoWorkEventHandler(bgWorker_DoWork);//开始工作
bw.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);//进度条改变调用事件
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);//进度条完成调用事件
}
3:后台调用
#region BackgroundWorker 线程显示进度条
double count = 0;
//后台工作将异步执行
public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
if (bw.CancellationPending)
{
//用户取消了工作
e.Cancel = true;
return;
}
//计算总进度条的当前进度
double currnum = i + 1;
double sum = dt.Rows.Count;
currProgress = currnum / sum * 100;
jPGFile = Convert.ToString(dt.Rows[i]["PicPath"]);
//调用的需要线程来跑的方法(耗时)
count = SmartComparisonIMG(SourceImg, jPGFile, MaxPoint, FromX, FromY, FromWidth, FromHeight, A, B, e, sender);
}
}
//进度改变事件
public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e)
{
if (!string.IsNullOrEmpty(jPGFile))
{
try
{
this.pictureBox2.Image = Image.FromFile(jPGFile);
}
catch (Exception)
{
this.pictureBox2.Image = null;
}
}
//我的进度条值是在调用的方法SmartComparisonIMG里面手动改变的
myProgressBar1.Value = e.ProgressPercentage;//进度更新
if (myProgressBar1.Value == 100)
{
myProgressBar2.Value = Convert.ToInt32(currProgress);
}
}
//后台工作执行完毕,IsBusy设置为False
public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//e.Error == null 是否发生错误
//e.Cancelled 完成是由于取消还是正常完成
if (e.Cancelled)
{
MessageBox.Show("取消了操作");
}
else
{
MessageBox.Show("正常完成了操作");
}
}
#endregion
3:界面显示
4:进度条添加百分比显示代码
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SmartComparisonIMG
{
public class MyProgressBar:ProgressBar
{
//自定义进度条控件
public MyProgressBar()
{
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
}
protected override void OnPaint(PaintEventArgs e)
{
Rectangle rect = ClientRectangle;
Graphics g = e.Graphics;
ProgressBarRenderer.DrawHorizontalBar(g, rect);
rect.Inflate(-3, -3);
if (Value > 0)
{
var clip = new Rectangle(rect.X, rect.Y, (int)((float)Value / Maximum * rect.Width), rect.Height);
ProgressBarRenderer.DrawHorizontalChunks(g, clip);
}
string text = string.Format("{0}%", Value * 100 / Maximum); ;
using (var font = new Font(FontFamily.GenericSerif, 9))
{
SizeF sz = g.MeasureString(text, font);
var location = new PointF(rect.Width / 2 - sz.Width / 2, rect.Height / 2 - sz.Height / 2 + 2);
g.DrawString(text, font, Brushes.Black, location);
}
}
}
}