Aracılığıyla paylaş


Zamanlayıcılar

.NET, çok iş parçacıklı bir ortamda kullanılmak üzere üç farklı zamanlayıcı sunar:

Uyarı

Bazı .NET uygulamaları ek zamanlayıcılar içerebilir:

  • System.Windows.Forms.Timer: Bir olayı düzenli aralıklarla tetikleyen bir Windows Forms bileşeni. Bileşen, bir kullanıcı arabirimine sahip değildir ve tek iş parçacıklı bir ortamda kullanılmak üzere tasarlanmıştır.
  • System.Web.UI.Timer: zaman uyumsuz veya zaman uyumlu web sayfası geri gönderme işlemlerini düzenli aralıklarla gerçekleştiren bir ASP.NET bileşeni.
  • System.Windows.Threading.DispatcherTimer: belirli bir zaman aralığında ve belirtilen bir önceliğe göre işlenen kuyruğa entegre edilmiş bir Dispatcher zamanlayıcı.

System.Threading.Timer sınıfı

sınıfı, System.Threading.Timer belirtilen zaman aralıklarında sürekli olarak bir temsilci çağırmanızı sağlar. Bu sınıfı, belirli bir zaman aralığında bir temsilciye tek bir çağrı zamanlamak için de kullanabilirsiniz. Temsilci bir ThreadPool thread'de yürütülür.

Bir System.Threading.Timer nesne oluşturduğunuzda, geri çağırma yöntemini tanımlayan bir TimerCallback temsilci, geri çağırmaya geçirilen isteğe bağlı bir durum nesnesi, geri çağırmanın ilk çağrılmadan önce geciktirilmesi gereken süre ve geri çağırmalar arasındaki zaman aralığını belirtirsiniz. Bekleyen bir zamanlayıcıyı iptal etmek için Timer.Dispose yöntemini çağırın.

Aşağıdaki örnek, sağlanan temsilciyi bir saniye (1000 milisaniye) sonra ilk kez çağıran ve ardından iki saniyede bir çağıran bir zamanlayıcı oluşturur. Örnekteki durum nesnesi, temsilcinin kaç kez çağrıldığını saymak için kullanılır. Temsilci en az 10 kez çağrıldığında zamanlayıcı durdurulur.

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

Daha fazla bilgi ve örnek için bkz System.Threading.Timer. .

System.Timers.Timer sınıfı

Çok iş parçacıklı bir ortamda kullanılabilecek başka bir zamanlayıcı, System.Timers.Timer varsayılan olarak bir iş parçacığında ThreadPool bir olay tetikler.

Bir System.Timers.Timer nesne oluşturduğunuzda, bir olayın tetiklendiği Elapsed zaman aralığını belirtebilirsiniz. Zamanlayıcının bir Enabled olayı tetikleyip tetiklememesi gerektiğini belirtmek için Elapsed özelliğini kullanın. Belirtilen aralık geçtikten sonra bir olayın yalnızca bir kez tetiklenmesi gerekiyorsa, Elapsed değerini AutoReset olarak ayarlayın. Varsayılan AutoReset özelliği değeri true olup, bu, Elapsed olayının Interval özelliği tarafından tanımlanan aralıkta düzenli olarak tetiklendiği anlamına gelir.

Daha fazla bilgi ve örnek için bkz System.Timers.Timer. .

System.Threading.PeriodicTimer sınıfı

Belirtilen bir aralıktaki her bir tick'i beklemenizi sağlayan System.Threading.PeriodicTimer sınıfı, PeriodicTimer.WaitForNextTickAsync çağrısından sonra iş yapmanızı sağlar.

Bir System.Threading.PeriodicTimer nesne oluşturduğunuzda, zamanlayıcının her bir onay işareti arasındaki süreyi belirleyen bir TimeSpan belirtirsiniz. Önceki zamanlayıcı sınıflarında olduğu gibi bir geri çağırma iletmek veya bir olay işleyicisi ayarlamak yerine, WaitForNextTickAsync'yu bekleyerek belirtilen aralık süresince zamanlayıcıyı ilerletmek için doğrudan kapsam dahilinde çalışma gerçekleştirirsiniz.

WaitForNextTickAsync yöntemi, zamanlayıcı başarıyla tetiklendiğinde bir ValueTask<bool>; zamanlayıcı, true çağrılarak iptal edildiğinde ise bir false döndürür. WaitForNextTickAsync isteğe bağlı olarak bir CancellationTokenkabul eder ve bu da iptal istendiğinde sonucu TaskCanceledException olarak elde eder.

Daha fazla bilgi için bkz. System.Threading.PeriodicTimer.

Ayrıca bakınız