110,538
社区成员
发帖
与我相关
我的任务
分享
public partial class Form1 : Form
{
/// <summary>
/// 后台线程
/// </summary>
private BackgroundWorker bkWorker = new BackgroundWorker();
/// <summary>
/// 步进值
/// </summary>
private int percentValue = 0;
public Form1()
{
InitializeComponent();
bkWorker.WorkerReportsProgress = true;
bkWorker.WorkerSupportsCancellation = true;
bkWorker.DoWork += new DoWorkEventHandler(DoWork);
bkWorker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
bkWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
}
private void btnStart_Click(object sender, EventArgs e)
{
percentValue = 10;
this.progressBar1.Maximum = 1000;
// 执行后台操作
bkWorker.RunWorkerAsync();
}
public void DoWork(object sender, DoWorkEventArgs e)
{
// 事件处理,指定处理函数
e.Result = ProcessProgress(bkWorker, e);
}
public void ProgessChanged(object sender, ProgressChangedEventArgs e)
{
// bkWorker.ReportProgress 会调用到这里,此处可以进行自定义报告方式
this.progressBar1.Value = e.ProgressPercentage;
int percent = (int)(e.ProgressPercentage / percentValue);
this.label1.Text = "处理进度:" + Convert.ToString(percent) + "%";
}
public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
{
this.label1.Text = "处理完毕!";
}
private int ProcessProgress(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 1000; i++)
{
if (bkWorker.CancellationPending)
{
e.Cancel = true;
return -1;
}
else
{
// 状态报告
bkWorker.ReportProgress(i);
// 等待,用于UI刷新界面,很重要
System.Threading.Thread.Sleep(1);
}
}
return -1;
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void SetNotifyInfo(int percent, string message)
{
this.label1.Text = message;
this.progressBar1.Value = percent;
}
}
List<a> a;
List<b> b;
List<c> c;
int total = a.Count+b.Count+c.Count;
int num=0;
foreach(var i in a)
{
num++;//然后调用通知
}
foreach(var i in b)
{
num++;//然后调用通知
}
// 状态报告
bkWorker.ReportProgress(i);
不是有这段代码吗?
如果你的sql是批量插入,然后你就可以按批量设置这个i的值了啊
public partial class Form1 : Form
{
private BackgroundWorker bkWorker = new BackgroundWorker();
private Form2 notifyForm = new Form2();
public Form1()
{
InitializeComponent();
// 使用BackgroundWorker时不能在工作线程中访问UI线程部分,
// 即你不能在BackgroundWorker的事件和方法中操作UI,否则会抛跨线程操作无效的异常
// 添加下列语句可以避免异常。
CheckForIllegalCrossThreadCalls = false;
bkWorker.WorkerReportsProgress = true;
bkWorker.WorkerSupportsCancellation = true;
bkWorker.DoWork += new DoWorkEventHandler(DoWork);
bkWorker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
bkWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
}
private void btnStart_Click(object sender, EventArgs e)
{
notifyForm.StartPosition = FormStartPosition.CenterParent;
bkWorker.RunWorkerAsync();
notifyForm.ShowDialog();
}
public void DoWork(object sender, DoWorkEventArgs e)
{
// 事件处理,指定处理函数
e.Result = ProcessProgress(bkWorker, e);
}
public void ProgessChanged(object sender, ProgressChangedEventArgs e)
{
// bkWorker.ReportProgress 会调用到这里,此处可以进行自定义报告方式
notifyForm.SetNotifyInfo(e.ProgressPercentage, "处理进度:" + Convert.ToString(e.ProgressPercentage) + "%");
}
public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
{
notifyForm.Close();
MessageBox.Show("处理完毕!");
}
private int ProcessProgress(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 1000; i++)
{
if (bkWorker.CancellationPending)
{
e.Cancel = true;
return -1;
}
else
{
// 状态报告
bkWorker.ReportProgress(i / 10);
// 等待,用于UI刷新界面,很重要
System.Threading.Thread.Sleep(1);
}
}
return -1;
}
}
是这个 调用 from2