Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 暂停线程的模式类似于CancellationTokenSource和CancellationToken模式?_C#_Design Patterns_Cancellation_Pausing Execution_Cancellationtokensource - Fatal编程技术网

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

C# 暂停线程的模式类似于CancellationTokenSource和CancellationToken模式?,c#,design-patterns,cancellation,pausing-execution,cancellationtokensource,C#,Design Patterns,Cancellation,Pausing Execution,Cancellationtokensource,我开始使用ConcellationTokenSource和CancellationToken在framework 4.0中提供的协作线程取消模式,我发现它非常有用且简单 我现在的目的是为我的应用程序提供一个类似的优雅而简单的解决方案,只是暂停线程而不是取消线程。因为在这种情况下,请求与监听pause命令是不同的,所以我认为拥有PauseTokenSource和PauseToken之类的东西会更好。所以我的第一个问题是,你是否建议这样一种合作暂停的模式,或者它是否更好 如果有这样一个模式是个好主意

我开始使用ConcellationTokenSource和CancellationToken在framework 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();
    }
}

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

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

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

你有没有用它做过或者在任何地方实现过它?我很好奇你会用这个“特性”做什么…你不必
锁定
,因为
ManualResetEvent
类是线程安全的。