İş öğesi göndermek için zamanlayıcı kullanma

Önemli API'ler

Zamanlayıcının süresi dolduktan sonra çalışacak bir iş öğesi oluşturmayı öğrenin.

Tek seferlik bir zamanlayıcı oluşturun

İş öğesi için bir zamanlayıcı oluşturmak için CreateTimer yöntemini kullanın. İşi tamamlayan bir lambda sağlayın ve iş parçacığı havuzunun iş öğesini kullanılabilir bir iş parçacığına atamadan önce ne kadar bekleyeceğini belirtmek için delay parametresini kullanın. Gecikme bir TimeSpan yapısı kullanılarak belirtilir.

Note

WinUI 3 uygulamalarında, kullanıcı arabirimi iş parçacığına erişmek ve iş öğesinden ilerleme durumunu görüntülemek için Microsoft.UI.Dispatching.DispatcherQueue içindeki DispatcherQueue.TryEnqueue öğesini kullanın. Ayrıntılar için DispatcherQueue'a genel bakış bölümüne bakın.

Aşağıdaki örnek üç dakika içinde çalışan bir iş öğesi oluşturur:

TimeSpan delay = TimeSpan.FromMinutes(3);
            
ThreadPoolTimer DelayTimer = ThreadPoolTimer.CreateTimer(
    (source) =>
    {
        //
        // TODO: Work
        //
        
        //
        // Update the UI thread by using the UI core dispatcher.
        //
        Dispatcher.RunAsync(
            CoreDispatcherPriority.High,
            () =>
            {
                //
                // UI components can be accessed within this scope.
                //

            });

    }, delay);
TimeSpan delay;
delay.Duration = 3 * 60 * 10000000; // 10,000,000 ticks per second

ThreadPoolTimer ^ DelayTimer = ThreadPoolTimer::CreateTimer(
        ref new TimerElapsedHandler([this](ThreadPoolTimer^ source)
        {
            //
            // TODO: Work
            //
            
            //
            // Update the UI thread by using the UI core dispatcher.
            //
            Dispatcher->RunAsync(CoreDispatcherPriority::High,
                ref new DispatchedHandler([this]()
                {
                    //
                    // UI components can be accessed within this scope.
                    //

                    ExampleUIUpdateMethod("Timer completed.");

                }));

        }), delay);

Tamamlama işleyicisi sağlama

Gerekirse, timerDestroyedHandler ile iş öğesinin iptalini ve tamamlanmasını işleyin. Ek bir lambda sağlamak için CreateTimer aşırı yüklemesini kullanın. Bu, zamanlayıcı iptal edildiğinde veya iş öğesi tamamlandığında çalışır.

Aşağıdaki örnek, iş öğesini gönderen bir zamanlayıcı oluşturur ve iş öğesi tamamlandığında veya zamanlayıcı iptal edildiğinde bir yöntem çağırır:

TimeSpan delay = TimeSpan.FromMinutes(3);
            
bool completed = false;

ThreadPoolTimer DelayTimer = ThreadPoolTimer.CreateTimer(
    (source) =>
    {
        //
        // TODO: Work
        //

        //
        // Update the UI thread by using the UI core dispatcher.
        //
        Dispatcher.RunAsync(
                CoreDispatcherPriority.High,
                () =>
                {
                    //
                    // UI components can be accessed within this scope.
                    //

                });

        completed = true;
    },
    delay,
    (source) =>
    {
        //
        // TODO: Handle work cancellation/completion.
        //


        //
        // Update the UI thread by using the UI core dispatcher.
        //
        Dispatcher.RunAsync(
            CoreDispatcherPriority.High,
            () =>
            {
                //
                // UI components can be accessed within this scope.
                //

                if (completed)
                {
                    // Timer completed.
                }
                else
                {
                    // Timer cancelled.
                }

            });
    });
TimeSpan delay;
delay.Duration = 3 * 60 * 10000000; // 10,000,000 ticks per second

completed = false;

ThreadPoolTimer ^ DelayTimer = ThreadPoolTimer::CreateTimer(
        ref new TimerElapsedHandler([&](ThreadPoolTimer ^ source)
        {
            //
            // TODO: Work
            //

            //
            // Update the UI thread by using the UI core dispatcher.
            //
            Dispatcher->RunAsync(CoreDispatcherPriority::High,
                ref new DispatchedHandler([&]()
                {
                    //
                    // UI components can be accessed within this scope.
                    //

                }));

            completed = true;

        }),
        delay,
        ref new TimerDestroyedHandler([&](ThreadPoolTimer ^ source)
        {
            //
            // TODO: Handle work cancellation/completion.
            //

            Dispatcher->RunAsync(CoreDispatcherPriority::High,
                ref new DispatchedHandler([&]()
                {
                    //
                    // Update the UI thread by using the UI core dispatcher.
                    //

                    if (completed)
                    {
                        // Timer completed.
                    }
                    else
                    {
                        // Timer cancelled.
                    }

                }));
        }));

Zamanlayıcıyı iptal etme

Süreölçer hala geri sayılıyorsa ancak iş öğesi artık gerekli değilse İptal'i çağırın. Zamanlayıcı iptal edilir ve iş öğesi iş parçacığı havuzuna gönderilmeyecektir.

DelayTimer.Cancel();
DelayTimer->Cancel();

Remarks

Windows uygulamaları, çağıran iş parçacığını blokladığı için Thread.Sleep yönteminden kaçınmalıdır; bu yöntem UI iş parçacığında çağrılırsa kullanıcı arabiriminin yanıt vermemesine neden olabilir. Bunun yerine bir iş öğesi oluşturmak için ThreadPoolTimer kullanabilirsiniz; bu da UI iş parçacığını engellemeden iş öğesi tarafından gerçekleştirilen görevi geciktirir.

İş öğelerini, zamanlayıcı iş öğelerini ve periyodik iş öğelerini gösteren tam bir kod örneği için iş parçacığı havuzu örneğine bakın. Kod örneği başlangıçta Windows 8.1 için yazılmıştır, ancak kod Windows 10 yeniden kullanılabilir.

Zamanlayıcıları yineleme hakkında daha fazla bilgi için bkz. Düzenli aralıklarla çalışma öğesi oluşturma.