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

Jua*_*uan 8 c# backgroundworker request-cancelling cancellation

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

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

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

Mik*_*son 4

在我看来,你正忙着等待 while 循环。您应该使用事件信号来代替,例如。一个等待句柄。释放模式下的忙等待循环很可能会耗尽所有 CPU,给人一种冻结的感觉。

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

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