我使用BackgroundWorker
通过在循环内调用WebClient.DownloadString
来下载某些网站。我希望用户在下载内容时取消选项,所以每当我发现CancelAsync
在循环中间打开时,我就会调用CancellationPending
。
但是现在我注意到函数DownloadString
有时会冻结,所以我决定使用DownloadStringAsync
代替(所有这些都在用BackgroundWorker
创建的其他线程中)。因为我不想通过在调用DownloadStringAsync
之后退出循环和函数来重写我的整个代码,所以我在调用它之后立即做了一个while循环,除了检查变量{{1}之外什么都不做我在调用bool Stop
事件处理程序或用户请求取消操作时变为true。
现在,奇怪的是它在调试版本上运行良好;但是在第一个版本中,程序会在while循环中冻结,就好像它是主线程一样。
答案 0 :(得分:4)
听起来我很忙 - 等待一段时间。您应该使用事件信令,例如。一个WaitHandle。在发布模式下忙碌等待的循环可能会很好地消耗你所有的cpu,给人一种冻结的感觉。
在DownloadStringCompleted中发出WaitHandle信号,或者如果用户取消下载。
检查WaitHandle类上的MSDN docs。那里也有一个例子。
答案 1 :(得分:0)
将检查取消的while循环发送一段时间(几毫秒)。这很好地释放了其他线程和进程的CPU运行时。
答案 2 :(得分:0)
好主题,我用过 在我的后台工作者处理双重时间
int icounter = 1;
while (icounter < SomeListInventory.Count)
{
while (pauseWorker == false)
{
//-----------------------
//DO SOME WORK
icounter++;
//-----------------------
}
}
我有一个按钮暂停,当我按下它时,pauseWorker(全局变量或属性)变为true并且仅在第一次循环,而不增加icounter,并且当我再次使pauseworker = false时,过程继续