c# single-threaded-timer
Wollte ich einen timer mit den folgenden Eigenschaften:
-
Egal wie viele Male starten aufgerufen wird, nur ein call-back-thread wird immer ausgeführt
-
Die Zeit, in der call-back-Funktion wurde nicht mit Bezug auf das Intervall. E. g, wenn das Intervall 100ms und die rufen zurück nimmt 4000ms zu führen, der callback wird aufgerufen, bei 100ms, 4100ms etc.
Konnte ich nicht sehen, nichts zur Verfügung, so schrieb Sie den folgenden code. Gibt es einen besseren Weg, dies zu tun?
/**
* Will ensure that only one thread is ever in the callback
*/
public class SingleThreadedTimer : Timer
{
protected static readonly object InstanceLock = new object();
//used to check whether timer has been disposed while in call back
protected bool running = false;
virtual new public void Start()
{
lock (InstanceLock)
{
this.AutoReset = false;
this.Elapsed -= new ElapsedEventHandler(SingleThreadedTimer_Elapsed);
this.Elapsed += new ElapsedEventHandler(SingleThreadedTimer_Elapsed);
this.running = true;
base.Start();
}
}
virtual public void SingleThreadedTimer_Elapsed(object sender, ElapsedEventArgs e)
{
lock (InstanceLock)
{
DoSomethingCool();
//check if stopped while we were waiting for the lock, we don't want to restart if this is the case..
if (running)
{
this.Start();
}
}
}
virtual new public void Stop()
{
lock (InstanceLock)
{
running = false;
base.Stop();
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ein schnelles Beispiel ich klopfte;
Den .NET Framework bietet vier Timer. Zwei von diesen sind general-purpose Multithread
Timer:
Die anderen beiden sind für Besondere Zwecke, single-threaded-Timer:
Die letzten 2 sind zu beseitigen thread-Fragen der Sicherheit für WPF und Windows Forms-Anwendungen.
Beispielsweise mit WebBrowser im inneren Zeitgeber zum erfassen von screenshots aus der Webseite werden muss, um single-threaded ist, und gibt einen Fehler zur Laufzeit, wenn es auf einem anderen thread.
Die single-thread-Timer haben die folgenden Vorteile
Verarbeitung.
Tick-event-handling-code, ohne Kontrolle.BeginInvoke bzw.
Dispatcher.BeginIn voke.
Haupt-und Nachteil zu beachten
Was bedeutet, dass das Tick-event-handler ausführen muss, schnell,
ansonsten reagiert die Benutzeroberfläche.
Quelle: die meisten sind Fetzen aus C# in a Nutshell " Buch -> Kapitel 22 -> Advanced threading -> Timer -> Single-Threaded-Timer
Für jeden, der Sie braucht ein single-thread-timer und will zählen, Intervall, nach Aufgabe.
System.Timer.Timer könnte den trick tun, ohne sperren oder [ThreadStatic]
Kredit Alan N
Quelle https://www.codeproject.com/Answers/405715/System-Timers-Timer-single-threaded-usage#answer2
Edit: Abstand
Blick auf die
[ThreadStatic]
- Attribut und das .Net 4.0 ThreadLocal generischen Typ. Dies wird sich wahrscheinlich schnell geben Ihnen einen Weg, um code, der diese ohne messing mit Gewinde Verriegelung etc.Haben, könnten Sie einen Stapel in Ihrem Zeit-Klasse, und Sie umsetzen konnte ein Monitor () - Methode zurückgibt, IDisposable, so können Sie den timer zum Beispiel so:
Haben die timer-monitor-pop-Intervall Zeitstempel aus dem Stapel während der Dispose().
Codierung manuell alle sperren und thread-Anerkennung ist eine option, wie bereits erwähnt. Allerdings sperren beeinflussen die Zeit, wahrscheinlich mehr, als zu initialisieren einer Instanz pro thread mit ThreadLocal
Wenn du interessiert bist, könnte ich klopfen ein Beispiel später