0

我使用 ManualResetEnvent 来暂停/继续线程。代码示例如下。

private _rstEvent = new ManualResetEvent(true);

public void DoSomeWork()
{
    while(judgementValue)
    {
        _rstEvent.WaitOne();
        ...
    }
}

public void Pause()
{
    _rstEvent.Reset();
}

public void Continue()
{
    _rstEvent.Set();
}

问题是如果while循环很大怎么办,这意味着while语句中的每个循环都有很多操作要做。该线程将继续进行,直到遇到下一个_rstEvent.WaitOne();。除了不推荐使用的挂起之外,有没有办法立即暂停线程?

4

1 回答 1

4

Suspend,之类的问题Abort是您正试图对另一个线程做某事,而该线程当时实际上可能正在做任何事情

已经反复观察到,这可能导致难以诊断错误,例如,您当前的线程都无法获得锁,因为持有锁的线程已挂起或中止,因此永远不会释放锁(替代任何其他资源)还)。

这就是为什么现代线程机制是围绕协作原语构建的,其中线程本身(在适当的时刻)检查它是否被要求暂停或中止,并且可以确保它仅在不持有任何资源时才这样做。

没有理由你的循环代码不能在每次迭代中多次检查事件,只要它合适。

于 2022-02-21T08:07:18.343 回答