BackgroundWorker到底怎么才能停下来。。。

snlg5270 2011-03-03 03:00:31
话不多说,看我的代码,就是停不下来,求解!

private void getFile(){
threadWorker = new BackgroundWorker();
threadWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.threadWorker_RunWorkerCompleted);
threadWorker.ProgressChanged += new ProgressChangedEventHandler(this.threadWorker_ProgressChanged);
threadWorker.WorkerSupportsCancellation = true;
threadWorker.WorkerReportsProgress = true;
threadWorker.DoWork += new DoWorkEventHandler(DoWork);
threadWorker.WorkerSupportsCancellation = true;
}
private void DoWork(object sender, DoWorkEventArgs e)
{
Init();
byte[] digest = block(fileName);
if (digest != null)
{
//...
}
else
{
// ...
str = "计算已被终止";
}
e.Result = md5Hash;
}
private byte[] block(string fileName)
{
//...
while(true)
{ //...
if (threadWorker.CancellationPending)
{return null}
//...
}
//...
}
private void threadWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//...
}
private void stop_Click(object sender, EventArgs e)
{
if (threadWorker != null && threadWorker.IsBusy)
{
threadWorker.CancelAsync();
}
}

求解啊。。每次都调用getFile这个方法,第一次点stop_Click的时候效果是能停下来,第二次调用getFile的方法后,再点stop_click就停不下来了。。。。求解!
...全文
265 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
snlg5270 2011-03-04
  • 打赏
  • 举报
回复
谢谢啦 已解决!原来需要生成一个新类就好了!不能把dowork也在执行类里
snlg5270 2011-03-04
  • 打赏
  • 举报
回复
刚才又测试了一下,执行CancelAsync();以后
CancellationPending 始终是 false
e.Cancel 的值也是 false
点了一以后好像没有执行一样
sgchen 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 snlg5270 的回复:]
引用 8 楼 xingyuebuyu 的回复:
你这个方法对于一个backgroundWorker可以,但是我那个按钮再点的时候又new 了一个,就停不下来了。[/Quote]

把backgroupworker保存到list里。
snlg5270 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xingyuebuyu 的回复:]
C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Windows……
[/Quote]

你这个方法对于一个backgroundWorker可以,但是我那个按钮再点的时候又new 了一个,就停不下来了。
xingyuebuyu 2011-03-03
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.backgroundWorker1.DoWork += new DoWorkEventHandler(DoWork);
this.backgroundWorker1.WorkerSupportsCancellation = true;

//this.backgroundWorker1.RunWorkerAsync();
}

private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
this.backgroundWorker1.CancelAsync();
button1.Enabled = true;
}

private void DoWork(object sender, DoWorkEventArgs e)
{
while (this.backgroundWorker1.CancellationPending == false)
{
if (e.Cancel == true)
{
Console.WriteLine("Cancel");
break;
}

Console.WriteLine(count.ToString());

Application.DoEvents();
}
}

int count = 0;
private void button2_Click(object sender, EventArgs e)
{
count += 1;
this.backgroundWorker1.RunWorkerAsync();
}
}
}


可以多次取消
  • 打赏
  • 举报
回复
嗯,如果勉强修改,可以改为:
while(! CancelFlag)
  • 打赏
  • 举报
回复
把你的
while(true)
这句删掉。

如果自己不想删,那么就请别人重写。
sugarforever 2011-03-03
  • 打赏
  • 举报
回复
宝典不在手边,只能凭空估计了,取消的时候把WorkerReportsProgress设为false看看
snlg5270 2011-03-03
  • 打赏
  • 举报
回复
还有一点忘记说了!
点了stop_click以后,主函数已经获取了"计算已被终止"这个字符串了,但是进度条还在动。。等待进度条满了以后,也能获得正确的值。
代码中md5Hash就是str。
snlg5270 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yalan 的回复:]
不管他是不是busy都给他cancel掉看看能正常停下来吗?
[/Quote]
还是停不下来。。。。。。。而且在不busy的时候出现异常
yalan 2011-03-03
  • 打赏
  • 举报
回复
不管他是不是busy都给他cancel掉看看能正常停下来吗?
yalan 2011-03-03
  • 打赏
  • 举报
回复
if (threadWorker != null && threadWorker.IsBusy)
{
threadWorker.CancelAsync();
}

条件中去掉threadWorker.IsBusy看看行不

110,571

社区成员

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

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

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