Domanda

Io tendo ad utilizzare il seguente modello un sacco di posti diversi per un ritardo a tempo con gli eventi di notifica di conto alla rovescia, e la possibilità di cancellare:

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

Quello che vorrei fare è astratto questo schema nel proprio sistema che posso usare per bloccare qualsiasi discussione particolare fino al raggiungimento di un conto alla rovescia. C'è una sorta di prassi per questo? Essa deve fornire un feedback di stato granulare (preferibilmente potrei dire che per notificare me ogni secondo, decimo di secondo, ecc), e deve sostenere la cancellazione (preferibilmente con risposta migliore rispetto al secondo). Sento che dovrei essere utilizzando la nuova funzionalità CountdownEvent in .NET 4.0, o forse usare un Monitor invece di dormire, ma spero in una certa comprensione meglio qui.

È stato utile?

Soluzione

La prima cosa da fare è separare le idee di feedback e cancellazione. Cioè, si dispone di un meccanismo di feedback e di un meccanismo di cancellazione, ma non sono affatto correlati. Se è possibile separare questi due concetti, allora le cose si fanno più facili da affrontare e anche i risultati migliori.

Si desidera fornire un feedback ad un certo intervallo di tempo, il che implica un timer. E piuttosto che di polling per vedere se è richiesta la cancellazione, è possibile attendere sulla maniglia di attesa.

Qualcosa di simile:

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

Presumo che che stai ricevendo il CancellationToken da qualche altra parte (vale a dire che è passato in, o si definiscono esso e gli altri possono influenzare il suo stato).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top