2010-06-12 65 views
8

我正在使用BackgroundWorker通过在循环内调用WebClient.DownloadString来下载一些网站。我希望用户在下载内容时取消选择,所以无论何时我发现CancellationPending在循环中间打开,我都会调用CancelAsync如何暂停BackgroundWorker?或类似的东西

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

现在,奇怪的是,它在调试版本上正常工作;但是在发行版中,程序在while循环中冻结,就像它是主线程一样。

回答

4

听起来你很忙 - 等待一段时间。你应该使用事件信号,例如。一个WaitHandle。释放模式下的忙碌等待循环可能会消耗掉所有的CPU,给人一种冻结的感觉。

在DownloadStringCompleted中指示WaitHandle,或者用户取消下载。

检查WaitHandle类上的MSDN docs。那里也有一个例子。

+0

WaitHandle的作品完美。谢谢! – Juan 2010-06-12 17:38:58

+0

在后台工作暂停/恢复循环http://stackoverflow.com/questions/8359058/pause-resume-loop-in-background-worker – 2012-12-31 01:40:12

0

发送您的while循环检查取消睡眠一会儿(几毫秒)。这充分释放了其他线程和进程的CPU运行时间。

+1

忙碌的等待是不好的做法。 – 2010-06-12 08:35:06

+0

我知道,我不知道在C#/ .Net中有什么像WaitHandle的东西(总是要学习新东西:-)),但有时轮询是唯一的解决方案,然后应该确保只进行轮询检查一次,然后放弃OS时间(在Linux中它的yield()函数)给线程/进程。 – Mark 2010-06-12 08:43:59

+0

WaitHandles也可以用于超时,这样可以防止轮询:)(而且我用我的份额忙等待,直到我明智..嘿嘿) – 2010-06-12 09:43:32

0

不错的话题,我用 在我的后台工作进程的双重同时

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

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

相关问题