Membuat item kerja berkala

API Penting

Pelajari cara membuat item kerja yang berulang secara berkala.

Membuat item kerja berkala

Gunakan metode CreatePeriodicTimer untuk membuat item kerja berkala. Berikan lambda yang menyelesaikan pekerjaan, dan gunakan parameter periode untuk menentukan interval antara pengiriman. Periode ditentukan menggunakan struktur TimeSpan . Item kerja akan dikirim ulang setiap kali periode berlalu, jadi pastikan periode cukup lama untuk pekerjaan selesai.

CreatePeriodicTimer mengembalikan objek ThreadPoolTimer . Simpan objek ini jika timer perlu dibatalkan.

Note

Hindari menentukan nilai nol (atau nilai apa pun kurang dari satu milidetik) untuk interval. Ini menyebabkan timer berkala berfungsi sebagai timer sekali jalan.

Note

Di aplikasi WinUI 3, gunakan DispatcherQueue.TryEnqueue dari Microsoft.UI.Dispatching.DispatcherQueue untuk mengakses utas UI dan tampilkan kemajuan dari item kerja. Lihat gambaran umum DispatcherQueue untuk detailnya.

Contoh berikut membuat item kerja yang berjalan setiap 60 detik sekali:

TimeSpan period = TimeSpan.FromSeconds(60);

ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((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.
                //

            });

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

ThreadPoolTimer ^ PeriodicTimer = ThreadPoolTimer::CreatePeriodicTimer(
        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.
                    //
                        
                }));

        }), period);

Menangani pembatalan item kerja berkala (opsional)

Jika diperlukan, Anda dapat menangani pembatalan timer berkala dengan TimerDestroyedHandler. Gunakan overload CreatePeriodicTimer untuk menyediakan lambda tambahan yang menangani pembatalan item kerja berkala.

Contoh berikut membuat item kerja berkala yang berulang setiap 60 detik dan juga menyediakan handler pembatalan:

using Windows.System.Threading;

    TimeSpan period = TimeSpan.FromSeconds(60);

    ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((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.
                //

            });
    },
    period,
    (source) =>
    {
        //
        // TODO: Handle periodic timer cancellation.
        //

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

                // Periodic timer cancelled.

            }));
    });
using namespace Windows::System::Threading;
using namespace Windows::UI::Core;

TimeSpan period;
period.Duration = 60 * 10000000; // 10,000,000 ticks per second

ThreadPoolTimer ^ PeriodicTimer = ThreadPoolTimer::CreatePeriodicTimer(
        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.
                    //

                }));

        }),
        period,
        ref new TimerDestroyedHandler([&](ThreadPoolTimer ^ source)
        {
            //
            // TODO: Handle periodic timer cancellation.
            //

            Dispatcher->RunAsync(CoreDispatcherPriority::High,
                ref new DispatchedHandler([&]()
                {
                    //
                    // UI components can be accessed within this scope.
                    //

                    // Periodic timer cancelled.

                }));
        }));

Batalkan pengatur waktu

Jika perlu, panggil metode Batal untuk menghentikan item kerja berkala agar tidak diulang. Jika item kerja sedang berjalan saat timer berkala dibatalkan, item kerja tersebut akan dibiarkan selesai. TimerDestroyedHandler (jika disediakan) dipanggil ketika semua instans item kerja berkala telah selesai.

PeriodicTimer.Cancel();
PeriodicTimer->Cancel();

Komentar

Untuk informasi tentang timer penggunaan tunggal, lihat Menggunakan timer untuk mengirimkan item kerja.