Question

J'ai tendance à utiliser le modèle suivant beaucoup d'endroits différents pour un retard chronométré avec les événements de notification de compte à rebours, et la possibilité d'annuler:

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));
}

Ce que je voudrais faire est abstraite ce modèle dans son propre système, je peux utiliser pour bloquer un thread particulier jusqu'à ce qu'un compte à rebours est atteint. Y at-il une sorte de meilleures pratiques pour cela? Il doit fournir une rétroaction d'état granulaire (de préférence je pouvais me le dire notifier chaque seconde, dixième de seconde, etc.), et il doit prendre en charge l'annulation (de préférence avec une meilleure réponse que chaque seconde). Je sens que je devrais utiliser la nouvelle fonctionnalité CountdownEvent dans .NET 4.0, ou peut-être un Monitor au lieu de simplement dormir, mais je suis l'espoir d'une meilleure idée ici.

Était-ce utile?

La solution

La première chose que vous devez faire est de séparer les idées de commentaires et d'annulation. Autrement dit, vous avez un mécanisme de rétroaction et un mécanisme d'annulation, mais ils ne sont pas du tout liés. Si vous pouvez séparer ces deux concepts, alors les choses deviennent plus faciles à traiter et aussi fonctionnent mieux.

Vous voulez faire des commentaires à un certain intervalle, ce qui implique une minuterie. Et plutôt que de vote pour voir si l'annulation est demandée, vous pouvez attendre sur la poignée d'attente.

Quelque chose comme:

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)));
}

Je suppose que vous obtenez le CancellationToken d'ailleurs (par exemple il est passé, ou vous définissez et d'autres peuvent affecter son état).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top