CancelAsync后再次RunWorkerAsync,发现重复执行

bychgh 2010-03-14 10:43:42
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("发送完毕");
}

}

}

...全文
317 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingyuebuyu 2010-03-15
  • 打赏
  • 举报
回复

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,做一件事就可以了。你那要多做了个循环,没必要
bychgh 2010-03-15
  • 打赏
  • 举报
回复
我的自定义很耗时的方法放在 ProgressChanged()里面有什么问题没
mayonglong 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xingyuebuyu 的回复:]
C# code

bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new Progr……
[/Quote]

委托支持多路广播~
xingyuebuyu 2010-03-14
  • 打赏
  • 举报
回复

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按钮,事件就多绑定一次,当然就会多执行一次啊.这跟你中途是否取消没有关系.

因为委托是支持多路广播的.

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧