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

时间:2011-04-22 10:23:32

标签: c# design-patterns cancellation pausing-execution cancellationtokensource

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

我的目的是为我的应用程序提供类似的优雅和简单的解决方案,但暂停线程而不是取消它们。因为在这种情况下,请求将与监听pause命令不同,我认为像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();
    }
}

1 个答案:

答案 0 :(得分:0)

为什么不创建PauseTokenSource可以实现的接口,并将其发送而不是PauseTokens。或者除了源之外还有令牌实例的好处是什么?我没有看到任何......

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

顺便说一句,WaitUntillPaused,如果不是WaitWhilePaused ......