如何暂停BackgroundWorker?或类似的东西

时间:2010-06-12 08:27:44

标签: c# backgroundworker cancellation request-cancelling

我使用BackgroundWorker通过在循环内调用WebClient.DownloadString来下载某些网站。我希望用户在下载内容时取消选项,所以每当我发现CancelAsync在循环中间打开时,我就会调用CancellationPending

但是现在我注意到函数DownloadString有时会冻结,所以我决定使用DownloadStringAsync代替(所有这些都在用BackgroundWorker创建的其他线程中)。因为我不想通过在调用DownloadStringAsync之后退出循环和函数来重写我的整个代码,所以我在调用它之后立即做了一个while循环,除了检查变量{{1}之外什么都不做我在调用bool Stop事件处理程序或用户请求取消操作时变为true。

现在,奇怪的是它在调试版本上运行良好;但是在第一个版本中,程序会在while循环中冻结,就好像它是主线程一样。

3 个答案:

答案 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时,过程继续