Best Practice für Thread -Verzögerungen mit Countdown -Benachrichtigung
-
26-10-2019 - |
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.
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).