Ein Unterschied besteht darin, dass System.Threading.Timer den Rückruf für einen Threadpool-Thread absetzt, anstatt jedes Mal einen neuen Thread zu erstellen. Wenn Sie dies mehr als einmal während der Laufzeit Ihrer Anwendung benötigen, sparen Sie den Overhead beim Erstellen und Zerstören einer Menge von Threads (ein Prozess, der sehr ressourcenintensiv ist, wie der Artikel, auf den Sie verweisen, hervorhebt) verwenden Sie einfach Threads im Pool, und wenn Sie mehr als einen Timer auf einmal haben, bedeutet dies, dass Sie weniger Threads auf einmal laufen haben (auch das spart erhebliche Ressourcen).
Mit anderen Worten, Timer wird viel effizienter sein. Es kann auch genauer sein, da Thread.Sleep garantiert nur so lange wartet, wie die von Ihnen angegebene Zeit (das Betriebssystem kann es viel länger schlafen legen). Zugegeben, Timer wird immer noch nicht genau sein, aber die Absicht ist es, den Callback so nahe wie möglich an der angegebenen Zeit abzufeuern, obwohl dies NICHT unbedingt die Absicht von Thread.Sleep ist.
Zum Löschen des Timers kann der Callback einen Parameter akzeptieren, so dass Sie möglicherweise den Timer selbst als Parameter übergeben und Dispose im Callback aufrufen können (obwohl ich das nicht versucht habe - ich denke, es ist möglich, dass der Timer während des Callbacks gesperrt sein könnte).
Edit: Nein, ich denke, Sie können dies nicht tun, da Sie den Callback-Parameter im Timer-Konstruktor selbst angeben müssen.
Vielleicht so etwas? (Auch hier haben nicht wirklich versucht)
class TimerState
{
public Timer Timer;
}
... und den Timer zu starten:
TimerState state = new TimerState();
lock (state)
{
state.Timer = new Timer((callbackState) => {
action();
lock (callbackState) { callbackState.Timer.Dispose(); }
}, state, millisecond, -1);
}
Die Verriegelung sollte die Timer-Rückruf verhindern versucht, den Timer vor dem Timer frei Feld wurde festgelegt.
Nachtrag: Wie der Kommentator darauf hingewiesen, wenn action() etwas mit der Benutzeroberfläche des Fall ist, dann eine System.Windows.Forms.Timer verwendet, ist wahrscheinlich eine bessere Wette, da es den Rückruf auf der Benutzeroberfläche läuft Faden. Wenn dies jedoch nicht der Fall ist und es auf Thread.Sleep vs. Threading.Timer ankommt, ist Threading.Timer der richtige Weg.
Es ist auch erwähnenswert, den Unterschied mit System.Windows.Forms.Timer, die ich glaube * eine Funktion auf dem UI-Thread aufruft, die wirklich wichtig für WinForms-Anwendungen ist! –
Für zukünftige Leser ist 'Sleep' nicht garantiert, dass es MINDESTENS ist, es ist dokumentiert, dass es weniger sein könnte. –
Aus Neugier ... wo ist das dokumentiert? –