【发布时间】:2017-04-29 13:40:30
【问题描述】:
也许我想太多了,但是我有许多线程在执行一个相当长的过程,并且我希望能够在必要时彻底中止它们。这主要是因为我不想在旧线程完成之前启动新线程。有没有办法通过事件或其他方法告诉线程完全中止?或者我不应该担心这个?目前我的中止方法中有如下代码:
private void AbortProcessing()
{
if (!Processing) return;
StopFlag = true;
for (int x = 0; x < MaxThreads; x++)
{
try
{
BW[x].CancelAsync();
}
catch { }
//Processing = false;
}
bool aborted = false;
while (!aborted)
{
aborted = true;
for (int x = 0; x < MaxThreads; x++)
{
if (BW[x].IsBusy) aborted = false;
}
Thread.Sleep(100);
}
}
在发出中止信号后,IsBusy 始终为真,因此这不起作用。有什么建议吗?
【问题讨论】:
-
是否有任何 BackgroudWorker 工作方法检查是否应该取消操作?
-
CancelAsync()只是表示线程应该被中止。您实际上是否在后台线程中检查该标志并退出它?这不会自动发生... -
这是一个典型的死锁案例,它是通用线程错误之一。 BGW 只能在其 RunWorkerCompleted 事件运行后才能完成。它无法运行,您正在通过循环和休眠来挂起 UI 线程。如果您不描述您认为需要循环的原因,就不可能为您提供更好的解决方案。
-
Idle_Mind,我正在检查并退出 CancellationPending 的处理是否为真。我想我认为当线程在这种情况下完成时会触发其他一些事件或标志。 RunWorkerCompleted 事件似乎没有触发,但我可能错了。我想知道此时我是否可以将 IsBusy 设置为 false。还是有更好的方法?
标签: c# multithreading backgroundworker