【问题标题】:A pattern for pausing threads similar to the CancellationTokenSource and CancellationToken pattern?类似于 CancellationTokenSource 和 CancellationToken 模式的暂停线程的模式?
【发布时间】:2011-04-22 10:23:31
【问题描述】:

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

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

【问题讨论】:

  • 你有没有做过这个或在任何地方实现过?
  • 我很好奇你会用这个“功能”来做什么......
  • 您不必lock,因为ManualResetEvent 类是线程安全的。

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


【解决方案1】:

为什么不做一个 PauseTokenSource 可以实现的接口,而不是 PauseTokens 发送它。或者拥有源以外的令牌实例有什么好处?没看到……

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

顺便说一句,WaitUntillPaused,应该不是 WaitWhilePaused...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2020-03-08
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多