Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A .NET három időzítőt biztosít többszálú környezetben:
- System.Threading.Timer, amely rendszeres időközönként hajt végre egyetlen visszahívási metódust egy ThreadPool szálon.
- System.Timers.Timer, amely alapértelmezés szerint rendszeres időközönként hoz létre eseményt egy ThreadPool szálon.
- System.Threading.PeriodicTimer, amely lehetővé teszi a hívó számára, hogy az időzítő egyes ketyegéseire várva végezze el a munkát.
Megjegyzés:
Egyes .NET-implementációk további időzítőket is tartalmazhatnak:
- System.Windows.Forms.Timer: egy Windows Forms-összetevő, amely rendszeres időközönként aktivál egy eseményt. Az összetevő nem rendelkezik felhasználói felülettel, és egyszálas környezetben való használatra lett kialakítva.
- System.Web.UI.Timer: egy ASP.NET összetevő, amely rendszeres időközönként végez aszinkron vagy szinkron weblap-utómunkákat.
- System.Windows.Threading.DispatcherTimer: az üzenetsorba Dispatcher integrált időzítő, amelyet meghatározott időközönként és meghatározott prioritással dolgoznak fel.
A System.Threading.Timer osztály
Az System.Threading.Timer osztály lehetővé teszi, hogy folyamatosan hívjon meg egy meghatalmazottat megadott időközönként. Ezzel az osztálysal egyetlen hívást is ütemezhet egy meghatalmazottnak egy megadott időintervallumban. A delegált a ThreadPool szálon lesz végrehajtva.
Objektum létrehozásakor meg kell adnia egy System.Threading.TimerTimerCallback olyan meghatalmazottat, aki meghatározza a visszahívási módszert, a visszahívásnak átadott opcionális állapotobjektumot, a visszahívás első meghívása előtti késleltetési időt, valamint a visszahívások közötti időintervallumot. Függőben lévő időzítő megszakításához hívja meg a metódust Timer.Dispose .
Az alábbi példa egy időzítőt hoz létre, amely egy másodperc (1000 ezredmásodperc) után először hívja meg a megadott meghatalmazottat, majd két másodpercenként hívja meg. A példában szereplő állapotobjektum megszámlálja, hogy a meghatalmazott hányszor van meghívva. Az időzítő leáll, ha a meghatalmazottat legalább 10 alkalommal meghívták.
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
private static Timer timer;
static void Main(string[] args)
{
var timerState = new TimerState { Counter = 0 };
timer = new Timer(
callback: new TimerCallback(TimerTask),
state: timerState,
dueTime: 1000,
period: 2000);
while (timerState.Counter <= 10)
{
Task.Delay(1000).Wait();
}
timer.Dispose();
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.");
}
private static void TimerTask(object timerState)
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.");
var state = timerState as TimerState;
Interlocked.Increment(ref state.Counter);
}
class TimerState
{
public int Counter;
}
}
Imports System.Threading
Module Program
Private Timer As Timer
Sub Main(args As String())
Dim StateObj As New TimerState
StateObj.Counter = 0
Timer = New Timer(New TimerCallback(AddressOf TimerTask), StateObj, 1000, 2000)
While StateObj.Counter <= 10
Task.Delay(1000).Wait()
End While
Timer.Dispose()
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.")
End Sub
Private Sub TimerTask(ByVal StateObj As Object)
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.")
Dim State As TimerState = CType(StateObj, TimerState)
Interlocked.Increment(State.Counter)
End Sub
Private Class TimerState
Public Counter As Integer
End Class
End Module
További információkért és példákért lásd: System.Threading.Timer.
A System.Timers.Timer osztály
Egy másik időzítő, amely többszálas környezetben is használható, az, System.Timers.Timer hogy alapértelmezés szerint eseményt hoz létre egy ThreadPool szálon.
Objektum létrehozásakor System.Timers.Timer megadhatja, hogy milyen időközönként kell eseményt Elapsed létrehoznia. Az Enabled tulajdonság használatával jelezheti, hogy egy időzítő eseményt Elapsed generáljon. Ha a megadott időköz eltelte után csak egyszer kell aktiválnia a Elapsed eseményt, állítsa be a AutoReset értékét false-re. A tulajdonság AutoResetalapértelmezett értéke aztrue, ami azt jelenti, hogy egy Elapsed eseményt rendszeresen emelnek ki a Interval tulajdonság által meghatározott időközönként.
További információkért és példákért lásd: System.Timers.Timer.
A System.Threading.PeriodicTimer osztály
Az System.Threading.PeriodicTimer osztály lehetővé teszi, hogy egy adott intervallum egyedi ketyegéseire várakozzon, és a PeriodicTimer.WaitForNextTickAsync hívása után tevékenységeket végezzen.
Objektum létrehozásakor System.Threading.PeriodicTimer meg kell adnia egy TimeSpan értéket, amely meghatározza az időzítő minden egyes üteme között eltelt időt. Ahelyett, hogy visszahívást ad át, vagy beállít egy eseménykezelőt, mint az előző időzítőosztályokban, közvetlenül a hatókörben kell elvégeznie a munkát, várva WaitForNextTickAsync , hogy a megadott időközzel előrelépjen az időzítőn.
A WaitForNextTickAsync metódus a ValueTask<bool> értéket adja vissza, amikor az időzítő sikeresen elindul, és a true értéket, amikor az időzítőt a false hívással megszakították.
WaitForNextTickAsync opcionálisan elfogad egy CancellationToken, ami TaskCanceledException eredményez, ha lemondást kértek.
További információért lásd System.Threading.PeriodicTimer.