Frage

Ich neige dazu, das folgende Muster zu verwenden, um eine zeitliche Verzögerung mit Countdown -Benachrichtigungsereignissen und die Fähigkeit zu stornieren:

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

Was ich gerne tun möchte, ist dieses Muster in ein eigenes System zusammenzuarbeiten, mit dem ich einen bestimmten Thread blockieren kann, bis ein Countdown erreicht ist. Gibt es dafür eine Art Best Practice? Es muss ein granuläres Status -Feedback geben (vorzugsweise könnte ich es mir in jeder Sekunde, Zehntel Sekunde usw. benachrichtigen), und es muss die Stornierung unterstützen (vorzugsweise mit einer besseren Reaktion als in jeder Sekunde). Ich habe das Gefühl, ich sollte das neue verwenden CountdownEvent Funktion in .net 4.0 oder vielleicht a verwenden Monitor Anstatt nur zu schlafen, aber ich hoffe auf einen besseren Einblick hier.

War es hilfreich?

Lösung

Das erste, was Sie tun sollten, ist die Ideen von Feedback und Stornierung zu trennen. Das heißt, Sie haben einen Feedback -Mechanismus und einen Stornierungsmechanismus, sind jedoch überhaupt nicht miteinander verbunden. Wenn Sie diese beiden Konzepte trennen können, werden die Dinge einfacher zu handhaben und werden auch besser abschneiden.

Sie möchten in einem Intervall Feedback geben, was einen Timer impliziert. Und anstatt zu befragen, ob die Stornierung angefordert wird, können Sie auf den Wartegriff warten.

Etwas wie:

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

Ich nehme an, dass Sie das bekommen CancellationToken Von irgendwo anders (dh es ist eingeliefert, oder Sie definieren es und andere können seinen Zustand beeinflussen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top