暂停线程的模式,类似于CancellationTokenSource和CancellationToken模式

本文关键字:模式 CancellationTokenSource CancellationToken 类似于 线程 暂停 | 更新日期: 2023-09-27 17:51:22

我开始使用框架4.0中由ConcellationTokenSource和CancellationToken提供的协作线程取消模式,我发现它非常有用和简单。

现在我的目的是为我的应用程序提供一个类似的优雅和简单的解决方案,但暂停线程而不是取消它们。因为在这种情况下,请求将不同于监听暂停命令,所以我认为拥有像PauseTokenSource和PauseToken这样的东西会很好。所以我的第一个问题是,如果你建议这样的合作暂停模式,或者是其他更好的模式。

如果有这样一个模式是一个好主意,你有什么建议或指导方针,如何做到这一点?目前,我认为源应该能够通过ManualResetEvent暂停和取消暂停,并且令牌应该有对源的引用。这是一份初稿,我希望你能给我一些改进的建议。
public class PauseTokenSource
{
    protected ManualResetEvent mre = new ManualResetEvent(true);
    object syncRoot = new object();
    public PauseToken PauseToken { get { return new PauseToken(this); } }
    public bool IsPauseRequested { get { return !mre.WaitOne(0); } }
    public void Pause()
    {
        mre.Reset();
    }
    public void UnPause()
    {
        mre.Set();
    }
    public void WaitUntillPaused()
    {
        mre.WaitOne();
    }
}
public class PauseToken
{
    private PauseTokenSource source;
    public PauseToken(PauseTokenSource source)
    {
        this.source = source;
    }
    public bool IsPauseRequested 
    { 
        get { return source != null && source.IsPauseRequested; } 
    }
    public void WaitUntillPaused()
    {
        if (source != null)
            source.WaitUntillPaused();
    }
}

暂停线程的模式,类似于CancellationTokenSource和CancellationToken模式

为什么不做一个PauseTokenSource可以实现的接口,并发送它而不是pausetoken呢?或者使用源之外的令牌实例有什么好处?我没看到任何…

public interface IPauseToken 
{
    bool IsPausedRequested { get; }
    void WaitUntillPaused();
}

顺便说一下,WaitUntillPaused,是不是应该是WaitWhilePaused。