Sdílet prostřednictvím


Monitorování průběhu a dokončení úlohy na pozadí

důležitá rozhraní API

Zjistěte, jak vaše aplikace dokáže rozpoznat průběh a dokončení hlášené úlohou na pozadí, která běží mimo proces. (U úloh na pozadí v procesu můžete nastavit sdílené proměnné, které označují průběh a dokončení.)

Průběh a dokončení úlohy na pozadí je možné monitorovat pomocí kódu aplikace. K tomu se aplikace přihlásí k odběru událostí z úloh na pozadí, které zaregistrovala v systému.

Vytvořte obslužnou rutinu události pro zpracování dokončených úloh na pozadí

Krok 1

Vytvořte obslužnou funkci pro obsluhu dokončených úloh na pozadí. Tento kód musí dodržovat konkrétní formát, který vyžaduje objekt IBackgroundTaskRegistration a objekt BackgroundTaskCompletedEventArgs.

Použijte následující stopu pro OnCompleted metodu obslužné rutiny události úlohy na pozadí.

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.
};

Krok 2

Přidejte kód do obslužné rutiny události, která se zabývá dokončením úlohy na pozadí.

Například vzor úlohy na pozadí aktualizuje uživatelské rozhraní.

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();
};

Vytvořit funkci obslužné rutiny události pro sledování postupu úkolu na pozadí

Krok 1

Vytvořte obslužnou funkci pro obsluhu dokončených úloh na pozadí. Tento kód musí dodržovat specifický vzor, který přijímá objekt IBackgroundTaskRegistration a objekt BackgroundTaskProgressEventArgs:

Pro metodu obslužné rutiny události na pozadí OnProgress použijte následující stopu:

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.
};

Krok 2

Přidejte kód do obslužné rutiny události, která se zabývá dokončením úlohy na pozadí.

Například ukázka úlohy na pozadí aktualizuje uživatelské rozhraní o stav průběhu předaný prostřednictvím parametru 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();
};

Zaregistrujte funkce obslužné rutiny událostí pro nové a stávající úlohy na pozadí.

Krok 1

Když aplikace poprvé zaregistruje úlohu na pozadí, měla by se pro ni zaregistrovat, aby dostávala informace o průběhu a dokončení, pokud se úloha spustí, i když je aplikace stále aktivní v popředí.

Například příklad úlohy na pozadí volá následující funkci pro každou úlohu na pozadí, kterou registruje:

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);
}

Krok 2

Když se aplikace spustí nebo přejde na novou stránku, na které je relevantní stav úlohy na pozadí, měl by se zobrazit seznam úloh na pozadí, které jsou aktuálně zaregistrovány, a přidružit je k funkcím obslužné rutiny událostí průběhu a dokončení. Seznam úloh na pozadí, které jsou aktuálně zaregistrovány aplikací, je uložen ve vlastnosti BackgroundTaskRegistration.AllTasks.

Příklad úlohy na pozadí používá následující kód pro připojení obslužných rutin událostí při navigaci na stránku SampleBackgroundTask:

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();
}