Шаблон для приостановки потоков, аналогичный шаблонам CancellationTokenSource и CancellationToken? - PullRequest
6 голосов
/ 22 апреля 2011

Я начал использовать шаблон отмены кооперативных потоков, предоставленный в framework 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();
    }
}

1 Ответ

0 голосов
/ 25 августа 2011

Почему бы не создать интерфейс, который может реализовать PauseTokenSource, и отправить его вместо PauseTokens.Или какая польза от наличия экземпляров токена, кроме источника?Я не вижу никаких ...

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

И, кстати, WaitUntillPaused, если это не WaitWhilePaused ...

...