Share via


Memantau kemajuan dan penyelesaian tugas latar belakang

API penting

Pelajari bagaimana aplikasi Anda dapat mengenali kemajuan dan penyelesaian yang dilaporkan oleh tugas latar belakang yang berjalan di luar proses. (Untuk tugas latar belakang dalam proses, Anda dapat mengatur variabel bersama untuk menandakan kemajuan dan penyelesaian.)

Kemajuan dan penyelesaian tugas latar belakang dapat dipantau oleh kode aplikasi. Untuk melakukannya, aplikasi berlangganan peristiwa dari tugas latar belakang yang telah terdaftar di sistem.

Membuat penanganan aktivitas untuk menangani tugas latar belakang yang telah selesai

Langkah 1

Buat fungsi penanganan aktivitas untuk menangani tugas latar belakang yang selesai. Kode ini perlu mengikuti jejak tertentu, yang mengambil objek IBackgroundTaskRegistration dan objek BackgroundTaskCompletedEventArgs .

Gunakan jejak berikut untuk metode penanganan aktivitas tugas latar belakang OnCompleted .

private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
{
    // TODO: Add code that deals with background task completion.
}
auto completed{ [this](
        Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
        Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
{
    // TODO: Add code that deals with background task completion.
} };
auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
{
    // TODO: Add code that deals with background task completion.
};

Langkah 2

Tambahkan kode ke penanganan aktivitas yang berkaitan dengan penyelesaian tugas latar belakang.

Misalnya, sampel tugas latar belakang memperbarui UI.

private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
{
    UpdateUI();
}
auto completed{ [this](
        Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
        Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
{
    UpdateUI();
} };
auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
{    
    UpdateUI();
};

Membuat fungsi penanganan aktivitas untuk menangani kemajuan tugas latar belakang

Langkah 1

Buat fungsi penanganan aktivitas untuk menangani tugas latar belakang yang selesai. Kode ini perlu mengikuti jejak tertentu, yang mengambil objek IBackgroundTaskRegistration dan objek BackgroundTaskProgressEventArgs :

Gunakan jejak berikut untuk metode penanganan aktivitas tugas latar belakang OnProgress:

private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
{
    // TODO: Add code that deals with background task progress.
}
auto progress{ [this](
    Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
    Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& /* args */)
{
    // TODO: Add code that deals with background task progress.
} };
auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
{
    // TODO: Add code that deals with background task progress.
};

Langkah 2

Tambahkan kode ke penanganan aktivitas yang berkaitan dengan penyelesaian tugas latar belakang.

Misalnya, sampel tugas latar belakang memperbarui UI dengan status kemajuan yang diteruskan melalui parameter args :

private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
{
    var progress = "Progress: " + args.Progress + "%";
    BackgroundTaskSample.SampleBackgroundTaskProgress = progress;
    UpdateUI();
}
auto progress{ [this](
    Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
    Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& args)
{
    winrt::hstring progress{ L"Progress: " + winrt::to_hstring(args.Progress()) + L"%" };
    BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
    UpdateUI();
} };
auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
{
    auto progress = "Progress: " + args->Progress + "%";
    BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
    UpdateUI();
};

Daftarkan fungsi penanganan aktivitas dengan tugas latar belakang baru dan yang sudah ada

Langkah 1

Ketika aplikasi mendaftarkan tugas latar belakang untuk pertama kalinya, aplikasi harus mendaftar untuk menerima pembaruan kemajuan dan penyelesaian untuk itu, jika tugas berjalan saat aplikasi masih aktif di latar depan.

Misalnya, sampel tugas latar belakang memanggil fungsi berikut pada setiap tugas latar belakang yang didaftarkannya:

private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task)
{
    task.Progress += new BackgroundTaskProgressEventHandler(OnProgress);
    task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
}
void SampleBackgroundTask::AttachProgressAndCompletedHandlers(Windows::ApplicationModel::Background::IBackgroundTaskRegistration const& task)
{
    auto progress{ [this](
        Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
        Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& args)
    {
        winrt::hstring progress{ L"Progress: " + winrt::to_hstring(args.Progress()) + L"%" };
        BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
        UpdateUI();
    } };

    task.Progress(progress);

    auto completed{ [this](
        Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
        Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
    {
        UpdateUI();
    } };

    task.Completed(completed);
}
void SampleBackgroundTask::AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration^ task)
{
    auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
    {
        auto progress = "Progress: " + args->Progress + "%";
        BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
        UpdateUI();
    };

    task->Progress += ref new BackgroundTaskProgressEventHandler(progress);

    auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
    {
        UpdateUI();
    };

    task->Completed += ref new BackgroundTaskCompletedEventHandler(completed);
}

Langkah 2

Saat aplikasi diluncurkan, atau menavigasi ke halaman baru di mana status tugas latar belakang relevan, aplikasi akan mendapatkan daftar tugas latar belakang yang saat ini terdaftar dan mengaitkannya dengan fungsi penanganan aktivitas kemajuan dan penyelesaian. Daftar tugas latar belakang yang saat ini didaftarkan oleh aplikasi disimpan di BackgroundTaskRegistration. Properti AllTasks .

Misalnya, sampel tugas latar belakang menggunakan kode berikut untuk melampirkan penanganan aktivitas saat halaman SampleBackgroundTask dinavigasi ke:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    foreach (var task in BackgroundTaskRegistration.AllTasks)
    {
        if (task.Value.Name == BackgroundTaskSample.SampleBackgroundTaskName)
        {
            AttachProgressAndCompletedHandlers(task.Value);
            BackgroundTaskSample.UpdateBackgroundTaskStatus(BackgroundTaskSample.SampleBackgroundTaskName, true);
        }
    }

    UpdateUI();
}
void SampleBackgroundTask::OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& /* e */)
{
    // A pointer back to the main page. This is needed if you want to call methods in MainPage such
    // as NotifyUser().
    m_rootPage = MainPage::Current;

    // Attach progress and completed handlers to any existing tasks.
    auto allTasks{ Windows::ApplicationModel::Background::BackgroundTaskRegistration::AllTasks() };

    for (auto const& task : allTasks)
    {
        if (task.Value().Name() == SampleBackgroundTaskName)
        {
            AttachProgressAndCompletedHandlers(task.Value());
            break;
        }
    }

    UpdateUI();
}
void SampleBackgroundTask::OnNavigatedTo(NavigationEventArgs^ e)
{
    // A pointer back to the main page.  This is needed if you want to call methods in MainPage such
    // as NotifyUser().
    rootPage = MainPage::Current;

    // Attach progress and completed handlers to any existing tasks.
    auto iter = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;
    while (hascur)
    {
        auto cur = iter->Current->Value;

        if (cur->Name == SampleBackgroundTaskName)
        {
            AttachProgressAndCompletedHandlers(cur);
            break;
        }

        hascur = iter->MoveNext();
    }

    UpdateUI();
}