Скачивание и установка обновлений пакетов из StoreDownload and install package updates from the Store

Начиная с Windows 10 версии 1607, можно использовать методы класса StoreContext в пространстве имен Windows.Services.Store, чтобы программным способом проверить наличие обновлений пакета для текущего приложения в Microsoft Store, а затем скачать и установить обновленные пакеты.Starting in Windows 10, version 1607, you can use methods of the StoreContext class in the Windows.Services.Store namespace to programmatically check for package updates for the current app from the Microsoft Store, and download and install the updated packages. Можно также запрашивать пакеты, которые были помечены как обязательные в Центре партнеров, и отключать функциональные возможности в приложении, пока обязательное обновление не будет установлено.You can also query for packages that you have marked as mandatory in Partner Center and disable functionality in your app until the mandatory update is installed.

Дополнительные методы StoreContext, представленные в Windows 10 версии 1803, позволяют скачивать и устанавливать обновления пакетов автоматически (не отображая пользовательский интерфейс уведомления пользователю), удалять дополнительный пакет и получать информацию о пакетах в очереди на скачивание и установку для вашего приложения.Additional StoreContext methods introduced in Windows 10, version 1803 enable you to download and install package updates silently (without displaying a notification UI to the user), uninstall an optional package, and get info about packages in the download and install queue for your app.

Эти функции помогают автоматически поддерживать базу пользователей в актуальном состоянии, используя последние версии приложения, дополнительные пакеты и сопутствующие услуги в Store.These features help you automatically keep your user base up to date with the latest version of your app, optional packages, and related services in the Store.

Скачивание и установка обновлений пакета с разрешения пользователяDownload and install package updates with the user's permission

В этом примере кода показано, как использовать метод GetAppAndOptionalStorePackageUpdatesAsync, чтобы обнаружить все доступные обновления пакетов в Store, а затем вызвать метод RequestDownloadAndInstallStorePackageUpdatesAsync для скачивания и установки обновлений.This code example demonstrates how to use the GetAppAndOptionalStorePackageUpdatesAsync method to discover all available package updates from the Store and then call the RequestDownloadAndInstallStorePackageUpdatesAsync method to download and install the updates. При использовании этого метода для скачивания и установки обновлений ОС отображает диалоговое окно с запросом разрешения пользователя, прежде чем скачивать обновления.When using this method to download and install updates, the OS displays a dialog that asks the user's permission before downloading the updates.

Примечание

Эти методы поддерживают обязательные и необязательные пакеты для вашего приложения.These methods support required and optional packages for your app. Необязательные пакеты удобно использовать для надстроек загружаемого содержимого (DLC), так как они позволяют разделить большое приложение при наличии ограничений на размер или доставить любое дополнительное содержимое отдельно от основного приложения.Optional packages are useful for downloadable content (DLC) add-ons, dividing your large app for size constraints, or for shipping additional content separate from your core app. Получение разрешения на отправку приложения, использующего дополнительные пакеты (включая надстройки DLC) в Store, описано в разделе Поддержка разработчиков для Windows.To get permission to submit an app that uses optional packages (including DLC add-ons) to the Store, see Windows developer support.

В коде этого примера предполагается следующее:This code example assumes:

  • Код выполняется в контексте страницы.The code runs in the context of a Page.
  • Страница содержит панель ProgressBar с именем downloadProgressBar для предоставления состояния операции загрузки.The Page contains a ProgressBar named downloadProgressBar to provide status for the download operation.
  • Файл кода содержит оператор using для пространств имен Windows.Services.Store, Windows.Threading.Tasks и Windows.UI.Popups.The code file has a using statement for the Windows.Services.Store, Windows.Threading.Tasks, and Windows.UI.Popups namespaces.
  • Приложение — однопользовательское и выполняется только в контексте пользователя, запустившего его.The app is a single-user app that runs only in the context of the user that launched the app. Для многопользовательского приложения используйте метод GetForUser, чтобы получить объект StoreContext, а не метод GetDefault.For a multi-user app, use the GetForUser method to get a StoreContext object instead of the GetDefault method.
private StoreContext context = null;

public async Task DownloadAndInstallAllUpdatesAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    // Get the updates that are available.
    IReadOnlyList<StorePackageUpdate> updates =
        await context.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count > 0)
    {
        // Alert the user that updates are available and ask for their consent
        // to start the updates.
        MessageDialog dialog = new MessageDialog(
            "Download and install updates now? This may cause the application to exit.", "Download and Install?");
        dialog.Commands.Add(new UICommand("Yes"));
        dialog.Commands.Add(new UICommand("No"));
        IUICommand command = await dialog.ShowAsync();

        if (command.Label.Equals("Yes", StringComparison.CurrentCultureIgnoreCase))
        {
            // Download and install the updates.
            IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> downloadOperation =
                context.RequestDownloadAndInstallStorePackageUpdatesAsync(updates);

            // The Progress async method is called one time for each step in the download
            // and installation process for each package in this request.
            downloadOperation.Progress = async (asyncInfo, progress) =>
            {
                await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
                () =>
                {
                    downloadProgressBar.Value = progress.PackageDownloadProgress;
                });
            };

            StorePackageUpdateResult result = await downloadOperation.AsTask();
        }
    }
}

Примечание

Чтобы только скачать доступные обновления пакетов (не устанавливая их), воспользуйтесь методом RequestDownloadStorePackageUpdatesAsync.To only download (but not install) the available package updates, use the RequestDownloadStorePackageUpdatesAsync method.

Отображение информации о ходе скачивания и установкиDisplay download and install progress info

При вызове метода RequestDownloadStorePackageUpdatesAsync или RequestDownloadAndInstallStorePackageUpdatesAsync можно назначить обработчик Progress, который будет вызываться один раз для каждого шага при скачивании (или скачивании и установке) для каждого пакета в этом запросе.When you call the RequestDownloadStorePackageUpdatesAsync or RequestDownloadAndInstallStorePackageUpdatesAsync method, you can assign a Progress handler that is called one time for each step in the download (or download and install) process for each package in this request. Обработчик получает объект StorePackageUpdateStatus, который предоставляет сведения о пакете обновления, создавшем уведомление о ходе выполнения.The handler receives a StorePackageUpdateStatus object that provides info about the update package that raised the progress notification. В предыдущем примере используется поле PackageDownloadProgress объекта StorePackageUpdateStatus для отображения хода выполнения скачивания и установки.The previous example uses the PackageDownloadProgress field of the StorePackageUpdateStatus object to display the progress of the download and install process.

Учтите, что при вызове RequestDownloadAndInstallStorePackageUpdatesAsync для скачивания и установки обновлений пакета в одной операции значение поля PackageDownloadProgress увеличивается с 0,0 до 0,8 во время скачивания для пакета, а затем увеличивается с 0,8 до 1,0 во время установки.Be aware that when you call RequestDownloadAndInstallStorePackageUpdatesAsync to download and install package updates in a single operation, the PackageDownloadProgress field increases from 0.0 to 0.8 during the download process for a package, and then it increases from 0.8 to 1.0 during the install. Поэтому при сопоставлении процента, показанного в специальном интерфейсе хода выполнения для значения поля PackageDownloadProgress, ваш интерфейс будет отображать 80 %, когда скачивание пакета закончится, а ОС отобразит диалоговое окно установки.Therefore, if you map the percentage shown in your custom progress UI directly to the value of the PackageDownloadProgress field, your UI will show 80% when the package is finished downloading and the OS displays the installation dialog. Если вы хотите, чтобы специальный интерфейс хода выполнения отображал 100 %, когда пакет будет скачан и готов к установке, вы можете изменить код и назначить 100 % для интерфейса хода выполнения, когда значение поля PackageDownloadProgress достигнет 0,8.If you want your custom progress UI to display 100% when the package is downloaded and ready to be installed, you can modify your code to assign 100% to your progress UI when the PackageDownloadProgress field reaches 0.8.

Скачивание и установка всех обновлений пакетов автоматическиDownload and install package updates silently

Начиная с Windows 10 версии 1803, можно использовать методы TrySilentDownloadStorePackageUpdatesAsync и TrySilentDownloadAndInstallStorePackageUpdatesAsync для автоматического скачивания и установки обновлений пакетов, не отображая пользовательский интерфейс уведомления пользователю.Starting in Windows 10, version 1803, you can use the TrySilentDownloadStorePackageUpdatesAsync and TrySilentDownloadAndInstallStorePackageUpdatesAsync methods to download and install package updates silently, without displaying a notification UI to the user. Эта операция завершится успешно, только если пользователь включил параметр Обновлять приложения автоматически в Store и не подключен к сети с лимитным тарифным планом.This operation will succeed only if the user has enabled the Update apps automatically setting in the Store and the user is not on a metered network. Прежде чем вызывать эти методы, нужно проверить свойство CanSilentlyDownloadStorePackageUpdates, чтобы определить, выполнены ли эти условия в настоящее время.Before calling these methods, you can first check the CanSilentlyDownloadStorePackageUpdates property to determine whether these conditions are currently met.

В этом примере кода показано, как использовать метод GetAppAndOptionalStorePackageUpdatesAsync, чтобы обнаружить все доступные обновления пакетов, а затем вызвать методы TrySilentDownloadStorePackageUpdatesAsync и TrySilentDownloadAndInstallStorePackageUpdatesAsync для автоматического скачивания и установки обновлений.This code example demonstrates how to use the GetAppAndOptionalStorePackageUpdatesAsync method to discover all available package updates and then call the TrySilentDownloadStorePackageUpdatesAsync and TrySilentDownloadAndInstallStorePackageUpdatesAsync methods to download and install the updates silently.

В коде этого примера предполагается следующее:This code example assumes:

  • В файле кода используется оператор using для пространств имен Windows.Services.Store и System.Threading.Tasks.The code file has a using statement for the Windows.Services.Store and System.Threading.Tasks namespaces.
  • Приложение — однопользовательское и выполняется только в контексте пользователя, запустившего его.The app is a single-user app that runs only in the context of the user that launched the app. Для многопользовательского приложения используйте метод GetForUser, чтобы получить объект StoreContext, а не метод GetDefault.For a multi-user app, use the GetForUser method to get a StoreContext object instead of the GetDefault method.

Примечание

Методы IsNowAGoodTimeToRestartApp, RetryDownloadAndInstallLater и RetryInstallLater, вызываемые в коде в этом примере, являются методами-заполнителями, которые реализуются по мере надобности в соответствии со структурой вашего приложения.The IsNowAGoodTimeToRestartApp, RetryDownloadAndInstallLater, and RetryInstallLater methods called by the code in this example are placeholder methods that are intended to be implemented as needed according to your own app's design.

private StoreContext context = null;

public async Task DownloadAndInstallAllUpdatesInBackgroundAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    // Get the updates that are available.
    IReadOnlyList<StorePackageUpdate> storePackageUpdates =
        await context.GetAppAndOptionalStorePackageUpdatesAsync();

    if (storePackageUpdates.Count > 0)
    {

        if (!context.CanSilentlyDownloadStorePackageUpdates)
        {
            return;
        }

        // Start the silent downloads and wait for the downloads to complete.
        StorePackageUpdateResult downloadResult =
            await context.TrySilentDownloadStorePackageUpdatesAsync(storePackageUpdates);

        switch (downloadResult.OverallState)
        {
            case StorePackageUpdateState.Completed:
                // The download has completed successfully. At this point, confirm whether your app
                // can restart now and then install the updates (for example, you might only install
                // packages silently if your app has been idle for a certain period of time). The
                // IsNowAGoodTimeToRestartApp method is not implemented in this example, you should
                // implement it as needed for your own app.
                if (IsNowAGoodTimeToRestartApp())
                {
                    await InstallUpdate(storePackageUpdates);
                }
                else
                {
                    // Retry/reschedule the installation later. The RetryInstallLater method is not  
                    // implemented in this example, you should implement it as needed for your own app.
                    RetryInstallLater();
                    return;
                }
                break;
            // If the user cancelled the download or you can't perform the download for some other
            // reason (for example, Wi-Fi might have been turned off and the device is now on
            // a metered network) try again later. The RetryDownloadAndInstallLater method is not  
            // implemented in this example, you should implement it as needed for your own app.
            case StorePackageUpdateState.Canceled:
            case StorePackageUpdateState.ErrorLowBattery:
            case StorePackageUpdateState.ErrorWiFiRecommended:
            case StorePackageUpdateState.ErrorWiFiRequired:
            case StorePackageUpdateState.OtherError:
                RetryDownloadAndInstallLater();
                return;
            default:
                break;
        }
    }
}

private async Task InstallUpdate(IReadOnlyList<StorePackageUpdate> storePackageUpdates)
{
    // Start the silent installation of the packages. Because the packages have already
    // been downloaded in the previous method, the following line of code just installs
    // the downloaded packages.
    StorePackageUpdateResult downloadResult =
        await context.TrySilentDownloadAndInstallStorePackageUpdatesAsync(storePackageUpdates);

    switch (downloadResult.OverallState)
    {
        // If the user cancelled the installation or you can't perform the installation  
        // for some other reason, try again later. The RetryInstallLater method is not  
        // implemented in this example, you should implement it as needed for your own app.
        case StorePackageUpdateState.Canceled:
        case StorePackageUpdateState.ErrorLowBattery:
        case StorePackageUpdateState.OtherError:
            RetryInstallLater();
            return;
        default:
            break;
    }
}

Обязательные обновления пакетовMandatory package updates

При создании отправки пакета для приложения, которое нацелено на Windows 10 версии 1607 или более поздней версии, можно пометить пакет как обязательный и указать дату и время, когда он становится таковым.When you create a package submission in Partner Center for an app that targets Windows 10, version 1607 or later, you can mark the package as mandatory and the date and time on which it becomes mandatory. Если это свойство задано и приложение обнаружит, что обновление пакета доступно, приложение может определить, является ли пакет обновления обязательным, и изменить свой режим работы до тех пор, пока обновление не будет установлено (например, приложение может отключить определенные компоненты).When this property is set and your app discovers that the package update is available, your app can determine whether the update package is mandatory and alter its behavior until the update is installed (for example, your app can disable features).

Примечание

Обязательный статус обновления пакета не реализуется корпорацией Майкрософт принудительно, и ОС не предоставляет пользовательский интерфейс, указывающий пользователям, что обязательное обновление приложения необходимо установить.The mandatory status of a package update is not enforced by Microsoft, and the OS does not provide a UI to indicate to users that a mandatory app update must be installed. Разработчики должны использовать обязательную настройку, чтобы принудительно реализовать обязательные обновления приложений в своем коде.Developers are intended to use the mandatory setting to enforce mandatory app updates in their own code.

Чтобы пометить отправку пакета как обязательную, выполните следующие действия:To mark a package submission as mandatory:

  1. Войдите в Центр партнеров и перейдите на страницу обзора своего приложения.Sign in to Partner Center and navigate to the overview page for your app.
  2. Щелкните имя отправки, содержащий пакет обновления, которые вы хотите сделать обязательным.Click the name of the submission that contains the package update you want to make mandatory.
  3. Перейдите на страницу Пакеты для этой отправки.Navigate to the Packages page for the submission. В нижней части страницы выберите Сделать это обновление обязательным и выберите день и время, когда пакет станет обязательным.Near the bottom of this page, select Make this update mandatory and then choose the day and time on which the package update becomes mandatory. Этот параметр применяется ко всем пакетам UWP в отправке.This option applies to all UWP packages in the submission.

Дополнительные сведения об этом см. в разделе Отправка пакетов приложений.For more information, see Upload app packages.

Примечание

Если создается тестовый пакет, можно пометить пакеты как обязательные, воспользовавшись аналогичным элементом пользовательского интерфейса на странице Пакеты тестируемой возможности.If you create a package flight, you can mark the packages as mandatory using a similar UI on the Packages page for the flight. В этом случае обязательное обновление пакета применяется только к клиентам, которые являются частью тестовой группы.In this case, the mandatory package update applies only to the customers who are part of the flight group.

Пример кода для обязательных пакетовCode example for mandatory packages

В следующем примере кода показано, как определить, являются ли пакеты обновления обязательными.The following code example demonstrates how to determine whether any update packages are mandatory. Как правило, если обязательное обновление пакета не скачивается или не устанавливается успешно, необходимо правильно понизить версию приложения для пользователя.Typically, you should downgrade your app experience gracefully for the user if a mandatory package update does not successfully download or install.

private StoreContext context = null;

// Downloads and installs package updates in separate steps.
public async Task DownloadAndInstallAllUpdatesAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }  

    // Get the updates that are available.
    IReadOnlyList<StorePackageUpdate> updates =
        await context.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count != 0)
    {
        // Download the packages.
        bool downloaded = await DownloadPackageUpdatesAsync(updates);

        if (downloaded)
        {
            // Install the packages.
            await InstallPackageUpdatesAsync(updates);
        }
    }
}

// Helper method for downloading package updates.
private async Task<bool> DownloadPackageUpdatesAsync(IEnumerable<StorePackageUpdate> updates)
{
    bool downloadedSuccessfully = false;

    IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> downloadOperation =
        this.context.RequestDownloadStorePackageUpdatesAsync(updates);

    // The Progress async method is called one time for each step in the download process for each
    // package in this request.
    downloadOperation.Progress = async (asyncInfo, progress) =>
    {
        await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
        () =>
        {
            downloadProgressBar.Value = progress.PackageDownloadProgress;
        });
    };

    StorePackageUpdateResult result = await downloadOperation.AsTask();

    switch (result.OverallState)
    {
        case StorePackageUpdateState.Completed:
            downloadedSuccessfully = true;
            break;
        default:
            // Get the failed updates.
            var failedUpdates = result.StorePackageUpdateStatuses.Where(
                status => status.PackageUpdateState != StorePackageUpdateState.Completed);

            // See if any failed updates were mandatory
            if (updates.Any(u => u.Mandatory && failedUpdates.Any(
                failed => failed.PackageFamilyName == u.Package.Id.FamilyName)))
            {
                // At least one of the updates is mandatory. Perform whatever actions you
                // want to take for your app: for example, notify the user and disable
                // features in your app.
                HandleMandatoryPackageError();
            }
            break;
    }

    return downloadedSuccessfully;
}

// Helper method for installing package updates.
private async Task InstallPackageUpdatesAsync(IEnumerable<StorePackageUpdate> updates)
{
    IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> installOperation =
        this.context.RequestDownloadAndInstallStorePackageUpdatesAsync(updates);

    // The package updates were already downloaded separately, so this method skips the download
    // operatation and only installs the updates; no download progress notifications are provided.
    StorePackageUpdateResult result = await installOperation.AsTask();

    switch (result.OverallState)
    {
        case StorePackageUpdateState.Completed:
            break;
        default:
            // Get the failed updates.
            var failedUpdates = result.StorePackageUpdateStatuses.Where(
                status => status.PackageUpdateState != StorePackageUpdateState.Completed);

            // See if any failed updates were mandatory
            if (updates.Any(u => u.Mandatory && failedUpdates.Any(failed => failed.PackageFamilyName == u.Package.Id.FamilyName)))
            {
                // At least one of the updates is mandatory, so tell the user.
                HandleMandatoryPackageError();
            }
            break;
    }
}

// Helper method for handling the scenario where a mandatory package update fails to
// download or install. Add code to this method to perform whatever actions you want
// to take, such as notifying the user and disabling features in your app.
private void HandleMandatoryPackageError()
{
}

Удаление дополнительных пакетовUninstall optional packages

Начиная с Windows 10 версии 1803, можно использовать методы RequestUninstallStorePackageAsync или RequestUninstallStorePackageByStoreIdAsync, чтобы удалить дополнительный пакет (включая пакет DLC) для текущего приложения.Starting in Windows 10, version 1803, you can use the RequestUninstallStorePackageAsync or RequestUninstallStorePackageByStoreIdAsync methods to uninstall an optional package (including a DLC package) for the current app. Например, если у вас есть приложение с содержимым, которое установлено с помощью дополнительных пакетов, можно предоставить пользовательский интерфейс, который позволяет удалять дополнительные пакеты, чтобы освободить место на диске.For example, if you have an app with content that is installed via optional packages, you might want to provide a UI that enables users to uninstall the optional packages to free up disk space.

В следующем примере кода показан вызов метода RequestUninstallStorePackageAsync.The following code example demonstrates how to call RequestUninstallStorePackageAsync. В коде из этого примера предполагается следующее:This example assumes:

  • В файле кода используется оператор using для пространств имен Windows.Services.Store и System.Threading.Tasks.The code file has a using statement for the Windows.Services.Store and System.Threading.Tasks namespaces.
  • Приложение — однопользовательское и выполняется только в контексте пользователя, запустившего его.The app is a single-user app that runs only in the context of the user that launched the app. Для многопользовательского приложения используйте метод GetForUser, чтобы получить объект StoreContext, а не метод GetDefault.For a multi-user app, use the GetForUser method to get a StoreContext object instead of the GetDefault method.
public async Task UninstallPackage(Windows.ApplicationModel.Package package)
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    var storeContext = StoreContext.GetDefault();
    IAsyncOperation<StoreUninstallStorePackageResult> uninstallOperation =
        storeContext.RequestUninstallStorePackageAsync(package);

    // At this point, you can update your app UI to show that the package
    // is installing.

    uninstallOperation.Completed += (asyncInfo, status) =>
    {
        StoreUninstallStorePackageResult result = uninstallOperation.GetResults();
        switch (result.Status)
        {
            case StoreUninstallStorePackageStatus.Succeeded:
                {
                    // Update your app UI to show the package as uninstalled.
                    break;
                }
            default:
                {
                    // Update your app UI to show that the package uninstall failed.
                    break;
                }
        }
    };
}

Получение сведений об очереди скачиванияGet download queue info

Начиная с Windows 10 версии 1803, можно использовать методы GetAssociatedStoreQueueItemsAsync и GetStoreQueueItemsAsync для получения информации о пакетах, которые сейчас находятся в очереди скачивания и установки из Store.Starting in Windows 10, version 1803, you can use the GetAssociatedStoreQueueItemsAsync and GetStoreQueueItemsAsync methods to get info about the packages that are in the current download and installation queue from the Store. Эти методы удобны, если ваше приложение или игра поддерживает большие дополнительные пакеты (включая DLC), скачивание и установка которых может занять несколько часов или дней, и вы хотите эффективно действовать в случае, когда клиент закрывает ваше приложение или игру до завершения скачивания и установки.These methods are useful if your app or game supports large optional packages (including DLCs) that can take hours or days to download and install, and you want to gracefully handle the case where a customer closes your app or game before the download and installation process is complete. Когда пользователь снова запустит приложение или игру, код может использовать эти методы, чтобы получить информацию о состоянии пакетов, которые до сих пор находятся в очереди скачивания и установки, чтобы пользователю можно было показать статус каждого пакета.When the customer starts your app or game again, your code can use these methods to get info about the state of the packages that are still in the download and installation queue so you can display the status of each package to the customer.

В следующем примере кода показано, как вызывать метод GetAssociatedStoreQueueItemsAsync, чтобы получить список текущих обновлений пакета для текущего приложения и извлечь сведения о статусе для каждого пакета.The following code example demonstrates how to call GetAssociatedStoreQueueItemsAsync to get the list of in-progress package updates for the current app and retrieve status info for each package. В коде из этого примера предполагается следующее:This example assumes:

  • В файле кода используется оператор using для пространств имен Windows.Services.Store и System.Threading.Tasks.The code file has a using statement for the Windows.Services.Store and System.Threading.Tasks namespaces.
  • Приложение — однопользовательское и выполняется только в контексте пользователя, запустившего его.The app is a single-user app that runs only in the context of the user that launched the app. Для многопользовательского приложения используйте метод GetForUser, чтобы получить объект StoreContext, а не метод GetDefault.For a multi-user app, use the GetForUser method to get a StoreContext object instead of the GetDefault method.

Примечание

Методы MarkUpdateInProgressInUI, RemoveItemFromUI, MarkInstallCompleteInUI, MarkInstallErrorInUI и MarkInstallPausedInUI, вызываемые в коде в этом примере, являются методами-заполнителями, которые реализуются по мере надобности в соответствии со структурой вашего приложения.The MarkUpdateInProgressInUI, RemoveItemFromUI, MarkInstallCompleteInUI, MarkInstallErrorInUI, and MarkInstallPausedInUI methods called by the code in this example are placeholder methods that are intended to be implemented as needed according to your own app's design.

private StoreContext context = null;

private async Task GetQueuedInstallItemsAndBuildInitialStoreUI()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    // Get the Store packages in the install queue.
    IReadOnlyList<StoreQueueItem> storeUpdateItems = await context.GetAssociatedStoreQueueItemsAsync();

    foreach (StoreQueueItem storeItem in storeUpdateItems)
    {
        // In this example we only care about package updates.
        if (storeItem.InstallKind != StoreQueueItemKind.Update)
            continue;

        StoreQueueItemStatus currentStatus = storeItem.GetCurrentStatus();
        StoreQueueItemState installState = currentStatus.PackageInstallState;
        StoreQueueItemExtendedState extendedInstallState =
            currentStatus.PackageInstallExtendedState;

        // Handle the StatusChanged event to display current status to the customer.
        storeItem.StatusChanged += StoreItem_StatusChanged;

        switch (installState)
        {
            // Download and install are still in progress, so update the status for this  
            // item and provide the extended state info. The following methods are not
            // implemented in this example; you should implement them as needed for your
            // app's UI.
            case StoreQueueItemState.Active:
                MarkUpdateInProgressInUI(storeItem, extendedInstallState);
                break;
            case StoreQueueItemState.Canceled:
                RemoveItemFromUI(storeItem);
                break;
            case StoreQueueItemState.Completed:
                MarkInstallCompleteInUI(storeItem);
                break;
            case StoreQueueItemState.Error:
                MarkInstallErrorInUI(storeItem);
                break;
            case StoreQueueItemState.Paused:
                MarkInstallPausedInUI(storeItem, installState, extendedInstallState);
                break;
        }
    }
}

private void StoreItem_StatusChanged(StoreQueueItem sender, object args)
{
    StoreQueueItemStatus currentStatus = sender.GetCurrentStatus();
    StoreQueueItemState installState = currentStatus.PackageInstallState;
    StoreQueueItemExtendedState extendedInstallState = currentStatus.PackageInstallExtendedState;

    switch (installState)
    {
        // Download and install are still in progress, so update the status for this  
        // item and provide the extended state info. The following methods are not
        // implemented in this example; you should implement them as needed for your
        // app's UI.
        case StoreQueueItemState.Active:
            MarkUpdateInProgressInUI(sender, extendedInstallState);
            break;
        case StoreQueueItemState.Canceled:
            RemoveItemFromUI(sender);
            break;
        case StoreQueueItemState.Completed:
            MarkInstallCompleteInUI(sender);
            break;
        case StoreQueueItemState.Error:
            MarkInstallErrorInUI(sender);
            break;
        case StoreQueueItemState.Paused:
            MarkInstallPausedInUI(sender, installState, extendedInstallState);
            break;
    }
}