【问题标题】:How can I pause a BackgroundWorker? Or something similar如何暂停 BackgroundWorker?或类似的东西
【发布时间】:2011-03-02 23:08:35
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# backgroundworker cancellation request-cancelling


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 忙着等待是不好的做法。
    • 我知道但我不知道在 C#/.Net 中有类似 WaitHandle 的东西(总是要学习的新东西 :-)),但有时轮询是唯一的解决方案,然后应该确保进程轮询只检查一次,然后放弃操作系统给线程/进程的 CPU 时间(在 Linux 中是 yield() 函数)。
    • WaitHandles 也可以与超时一起使用,这样可以防止轮询 :) (而且我一直在忙着等待,直到我变得更聪明......呵呵)
    【解决方案3】:

    不错的话题,我用过 在我的后台工作进程中加倍

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      相关资源
      最近更新 更多