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