6

Empecé a usar el patrón de cancelación de hebras cooperativas provisto en el framework 4.0 por ConcellationTokenSource y CancellationToken y lo encontré muy útil y simple.¿Un patrón para pausar subprocesos similares al patrón CancellationTokenSource y CancellationToken?

Mi propósito ahora es proporcionar a mi aplicación una solución similar, elegante y sencilla, pero para detener los hilos en lugar de cancelarlos. Como también en este caso el pedido sería diferente del comando de escuchar la pausa, pensé que tener algo como PauseTokenSource y PauseToken sería bueno. Así que mi primera pregunta es si sugiere un patrón así para la pausa cooperativa o si es mejor algo más.

Si es una buena idea tener un patrón así, ¿tiene alguna sugerencia o guía sobre cómo hacerlo? Por el momento, pensé que la fuente debería poder pausar y reanudar por un evento ManualResetEvent y que el token debería tener una referencia a la fuente. Sigue un primer borrador sobre el cual espero que pueda darme sugerencias para mejorarlo.

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

¿Ha hecho más con este o puesto en práctica en cualquier lugar? – phillip

+0

Tengo curiosidad por saber qué usaría esta "función" para ... – Kit

+0

No tiene que 'bloquear' ya que la clase' ManualResetEvent' es segura para subprocesos. –

Respuesta

0

Por qué no hacer una interfaz que PauseTokenSource puede poner en práctica, y enviarlo en lugar de en torno PauseTokens. ¿O cuál es el beneficio de tener instancias de tokens que no sean la fuente? No veo ninguna ...

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

Y, por cierto, WaitUntillPaused, caso de no ser WaitWhilePaused ...