6

フレームワーク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();
    }
}
4

1 に答える 1

0

PauseTokenSource が実装できるインターフェイスを作成し、PauseToken の代わりに送信してみませんか。または、ソース以外のトークン インスタンスを持つ利点は何ですか? 何も見えない...

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

ところで、WaitUntilPaused、WaitWhilePaused ではないはずです...

于 2011-08-24T21:36:31.300 に答える