BackgroundWorker做了个进度条,可以成功执行到最后,如果在执行过程中点取消进程后,再点击执行,发现会重复执行两次,如果再点取消,就会执行3次不知道什么原因,高手帮看看
public partial class Form1 : Form
{
private BackgroundWorker bw = new BackgroundWorker(); // string str1到 str9定义不贴了
IList<Model.sendMes> messList = new SQLServerDAL.sendMes().GetAllList("top 10 *", null, "id asc");// id desc FULLTUNNELCONTROLLib.FullTunnelServiceControlClass my = new FULLTUNNELCONTROLLib.FullTunnelServiceControlClass(); int successNum = 0;
public Form1()
{
InitializeComponent();
} private void btnSendAll_Click(object sender, EventArgs e)
{
ProgressForm progressForm = new ProgressForm();
progressForm.Show(); bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.ProgressChanged += new ProgressChangedEventHandler(progressForm.OnProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(progressForm.OnProcessCompleted); if (bw.IsBusy != true)
{
bw.RunWorkerAsync();
}
}
//取消
private void btnCancel_Click(object sender, EventArgs e)
{
if (bw.IsBusy)
{
this.lbProgress.Text = "Cancelling...";
bw.CancelAsync();
}
} private void bw_DoWork(object sender, DoWorkEventArgs e)
{
sendMes((BackgroundWorker)sender, e);
} private void sendMes(BackgroundWorker worker, DoWorkEventArgs e)
{ for (int i = 0; i < messList.Count; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{ worker.ReportProgress((i + 1) * (100 / messList.Count)); Thread.Sleep(500);
}
}
} private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//群发 ----耗时的方法
try
{
for (int i = 0; i < messList.Count; i++)
{
str5 = messList[i].mobilephone.ToString();
int ErrorMessage = Convert.ToInt32(my.FullTunnelServiceControl(ref str1, ref str2, ref str3, ref str4, ref str5, ref str6, ref str7, ref str8, ref str9)); if (ErrorMessage.ToString() == "1")
{
successNum = successNum + 1;
} }
this.lbProgress.Text = ("已发送" + e.ProgressPercentage.ToString() + "%"); }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
} } void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
this.lbProgress.Text = "Cancelled";
}
else if (e.Error != null)
{
this.lbProgress.Text = "Error";
}
else
{
this.lbProgress.Text = "Success!";
MessageBox.Show("发送完毕");
} } }
public partial class Form1 : Form
{
private BackgroundWorker bw = new BackgroundWorker(); // string str1到 str9定义不贴了
IList<Model.sendMes> messList = new SQLServerDAL.sendMes().GetAllList("top 10 *", null, "id asc");// id desc FULLTUNNELCONTROLLib.FullTunnelServiceControlClass my = new FULLTUNNELCONTROLLib.FullTunnelServiceControlClass(); int successNum = 0;
public Form1()
{
InitializeComponent();
} private void btnSendAll_Click(object sender, EventArgs e)
{
ProgressForm progressForm = new ProgressForm();
progressForm.Show(); bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.ProgressChanged += new ProgressChangedEventHandler(progressForm.OnProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(progressForm.OnProcessCompleted); if (bw.IsBusy != true)
{
bw.RunWorkerAsync();
}
}
//取消
private void btnCancel_Click(object sender, EventArgs e)
{
if (bw.IsBusy)
{
this.lbProgress.Text = "Cancelling...";
bw.CancelAsync();
}
} private void bw_DoWork(object sender, DoWorkEventArgs e)
{
sendMes((BackgroundWorker)sender, e);
} private void sendMes(BackgroundWorker worker, DoWorkEventArgs e)
{ for (int i = 0; i < messList.Count; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{ worker.ReportProgress((i + 1) * (100 / messList.Count)); Thread.Sleep(500);
}
}
} private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//群发 ----耗时的方法
try
{
for (int i = 0; i < messList.Count; i++)
{
str5 = messList[i].mobilephone.ToString();
int ErrorMessage = Convert.ToInt32(my.FullTunnelServiceControl(ref str1, ref str2, ref str3, ref str4, ref str5, ref str6, ref str7, ref str8, ref str9)); if (ErrorMessage.ToString() == "1")
{
successNum = successNum + 1;
} }
this.lbProgress.Text = ("已发送" + e.ProgressPercentage.ToString() + "%"); }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
} } void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
this.lbProgress.Text = "Cancelled";
}
else if (e.Error != null)
{
this.lbProgress.Text = "Error";
}
else
{
this.lbProgress.Text = "Success!";
MessageBox.Show("发送完毕");
} } }
解决方案 »
- using 命名空间 如何找到物理文件的?
- C# WINFORM 能不能實現類似電視結尾時那種字幕滾動?
- C#如何检测硬件型号,并自动生成报告,并发送到指定文件夹!
- 程序怎样会在用户按Ctrl+Enter这两个按键后,能触发butn类控件单击事件
- 一个奇怪的问题,大家进来帮我看看
- 这个sql语句该怎么写》?
- 怎么做一个图标程序来打开自己的网站
- 菜鸟问题:TabControl...
- 怎样将DataRow[] drs=dsr.Tables[0].Select(ser)查询出的行添加到DataSet中呀??
- C#中使用ADO.NET连接数据库,为何不能引用ADO?也就是using System.Data.ADO死活无法编译,为何?
- 【新手 求助】IIS5.1无法浏览ASPX
- 断点调试确实通过了,可是运行时无法显示
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.ProgressChanged += new ProgressChangedEventHandler(progressForm.OnProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(progressForm.OnProcessCompleted);这部分放在form_load事件中就好了,事件只需要在最开始绑定一次就可以了.你每次点击btnSendAll按钮,事件就多绑定一次,当然就会多执行一次啊.这跟你中途是否取消没有关系. 因为委托是支持多路广播的.
private void sendMes(BackgroundWorker worker, DoWorkEventArgs e)
{ for (int i = 0; i < messList.Count; i++)
{
//群发 ----耗时的方法
str5 = messList[i].mobilephone.ToString();
int ErrorMessage = Convert.ToInt32(my.FullTunnelServiceControl(ref str1, ref str2, ref str3, ref str4, ref str5, ref str6, ref str7, ref str8, ref str9)); if (ErrorMessage.ToString() == "1")
{
successNum = successNum + 1;
} worker.ReportProgress((i + 1) * (100 / messList.Count)); if (worker.CancellationPending == true)
{
e.Cancel = true;
break; }
else
{
Thread.Sleep(500);
}
}
} private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
try
{
this.lbProgress.Text = ("已发送" + e.ProgressPercentage.ToString() + "%");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
} }
耗时工作在sendMes中完成,也就是在bw_DoWork中完成,bw_ProgressChanged中只需要report Progress,做一件事就可以了。你那要多做了个循环,没必要