Pregunta

Tiendo a utilizar el siguiente patrón muchos lugares diferentes para un retraso cronometrado con eventos de notificación de cuenta regresiva y la capacidad de cancelar:

CancellationToken ctoken = new CancellationToken();
for (int i = 0; i < 10; i++)
{
    if (ctoken.IsCancellationRequested) break;
    Thread.Sleep(1000);
    if (ctoken.IsCancellationRequested) break;
    if (Status != null) Status(this, new StatusEventArgs(i));
}

Lo que me gustaría hacer es abstraer este patrón en su propio sistema que pueda usar para bloquear cualquier hilo en particular hasta alcanzar una cuenta regresiva. ¿Hay algún tipo de práctica para esto? Debe proporcionar comentarios de estado granular (preferiblemente podría decirle que me notifique cada segundo, décimo de un segundo, etc.), y debe admitir la cancelación (preferiblemente con una mejor respuesta que cada segundo). Siento que debería usar el nuevo CountdownEvent característica en .NET 4.0, o tal vez use un Monitor En lugar de simplemente dormir, pero espero una mejor visión aquí.

¿Fue útil?

Solución

Lo primero que debe hacer es separar las ideas de comentarios y cancelación. Es decir, tiene un mecanismo de retroalimentación y un mecanismo de cancelación, pero no están en absoluto relacionados. Si puede separar esos dos conceptos, las cosas se vuelven más fáciles de tratar y también funcionarán mejor.

Desea proporcionar comentarios en algún intervalo, lo que implica un temporizador. Y en lugar de sondear para ver si se solicita la cancelación, puede esperar el mango de espera.

Algo como:

int i = 0;
using (System.Threading.Timer tmr = new System.Threading.Timer((s) =>
    {
        if (Status != null) Status(this, new StatusEventArgs(i));
        ++i;
    }, null, 1000, 1000))
{
    token.WaitHandle.WaitOne(TimeSpan.FromSeconds(10)));
}

Supongo que estás recibiendo el CancellationToken Desde otro lugar (es decir, se pasa, o lo define y otros pueden afectar su estado).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top