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

问题描述:

我开始使用ConcellationTokenSource和CancellationToken在框架4.0中提供的协作线程取消模式,我发现它非常有用和简单。用于暂停类似于CancellationTokenSource和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(); 
    } 
} 
+0

你有这个做了或任何实现的呢? – phillip 2011-08-11 15:59:41

+0

我很好奇你会使用这个“功能”... – Kit 2011-08-20 23:15:14

+0

因为'ManualResetEvent'类是线程安全的,所以你不必'lock'。 – 2011-08-22 10:37:29

为什么不把那PauseTokenSource可以实现,并围绕其发送,而不是PauseTokens的接口。或者拥有源以外的令牌实例有什么好处?我没有看到任何...

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

顺便说一下,WaitUntillPaused,岂不是WaitWhilePaused ...