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();
}
}
¿Ha hecho más con este o puesto en práctica en cualquier lugar? – phillip
Tengo curiosidad por saber qué usaría esta "función" para ... – Kit
No tiene que 'bloquear' ya que la clase' ManualResetEvent' es segura para subprocesos. –