Megosztás:


Időzítők

A .NET három időzítőt biztosít többszálú környezetben:

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.

Lásd még