8

我正在使用 a通过在循环中BackgroundWorker调用来下载一些网站。WebClient.DownloadString我希望用户在下载内容的过程中取消选项,所以CancelAsync每当我发现它CancellationPending在循环中间时我都会打电话。

但是现在我注意到该函数DownloadString有时会冻结,所以我决定DownloadStringAsync改用(所有这些都在使用创建的另一个线程中BackgroundWorker)。而且由于我不想通过在调用后退出循环和函数来重写我的整个代码DownloadStringAsync,所以我在调用它之后立即创建了一个 while 循环,它只检查一个变量,当事件处理程序bool Stop时我变为 trueDownloadStringCompleted被调用或当用户请求取消操作时。

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

4

3 回答 3

4

听起来你正忙着等待一个while循环。您应该改用事件信号,例如。等待句柄。释放模式下的忙等待循环很可能会消耗你所有的 cpu,给人一种冻结的感觉。

在 DownloadStringCompleted 或用户取消下载时向 WaitHandle 发出信号。

检查 WaitHandle 类的MSDN 文档。那里也有一个例子。

于 2010-06-12T08:34:19.533 回答
0

将检查取消的 while 循环发送到睡眠一会儿(几毫秒)。这很好地为其他线程和进程释放了 CPU 运行时。

于 2010-06-12T08:33:44.653 回答
0

好话题,我在后台工作进程中使用了两次

 int icounter = 1;
 while (icounter < SomeListInventory.Count)
            {
                while (pauseWorker == false)
                { 
                    //-----------------------
                    //DO SOME WORK
                        icounter++;
                    //-----------------------
                }
            }

而且我有一个按钮暂停,当我按下它时,pauseWorker(全局变量或属性)变为真并仅在第一个while循环,而不增加icounter,当我再次使pauseworker = false时,过程继续

于 2012-01-18T08:49:42.920 回答