В приложении UWP я запускаю следующую фоновую задачу UWP, используя BackgroundTaskBuilder:
namespace Background.UWP
{
public sealed class BackgroundTask : IBackgroundTask
{
private WatchLoop _watchLoop;
public void Run(IBackgroundTaskInstance taskInstance)
{
ApplicationTriggerDetails details = taskInstance.TriggerDetails as ApplicationTriggerDetails;
var arg = details.Arguments["MyArg"].ToString();
// Start an infinite loop that periodically does some checks
_watchLoop = new WatchLoop(arg, new ToastNotification());
_watchLoop.Start();
}
}
}
Первый вопрос: выполняется ли эта фоновая задача бесконечно, если она не отменена определенными условиями проверки?
Второй вопрос: как в моем приложении UWP проверить, запущена ли уже эта фоновая задача? Я хочу избежать запуска второй фоновой задачи. Существует ли глобальный дескриптор этой задачи, который я могу сохранить (сериализовать) в глобальном хранилище (например, в базе данных) и использовать в следующем экземпляре приложения UWP?





Первый вопрос: выполняется ли эта фоновая задача бесконечно, если нет? отменено определенными условиями проверки?
Согласно документу Запускать фоновые задачи бесконечно. После запуска фоновой задачи (с помощью триггера или вызова службы приложения) и после отсрочки выполнения BackgroundTaskInstance, предоставленной методом Run, она может выполняться бесконечно. Если для приложения установлен режим «Управляется Windows», к нему все равно может быть применена квота энергопотребления, и его фоновые задачи не будут активированы, когда активен режим экономии заряда.
Второй вопрос: как в моем приложении UWP проверить, есть ли этот фон задача уже запущена? Я хочу избежать создания второго фона задача. Есть ли глобальный дескриптор этой задачи, который я могу сохранить? (сериализовано) в глобальном хранилище (например, в базе данных) и использовать в следующем экземпляр приложения UWP?
Список фоновых задач, зарегистрированных в данный момент приложением, хранится в свойстве BackgroundTaskRegistration.AllTasks. Рекомендуется проверить этот документ.
var taskRegistered = false;
var exampleTaskName = "ExampleBackgroundTask";
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
if (task.Value.Name == exampleTaskName)
{
taskRegistered = true;
break;
}
}
Да, может ли создание функции обработчика событий удовлетворить ваши потребности? вот так github.com/microsoft/Windows-universal-samples/blob/…
Я решил эту проблему следующим образом:
Прежде чем зарегистрироваться и запустить фоновую задачу, я провожу проверку, как в примере Цзюньцзе Чжу. Я регистрируюсь и запускаю фоновую задачу только в том случае, если она еще не зарегистрирована.
Затем я поместил try ... finally вокруг цикла _watchLoop.Start(), а в блоке Final я вставил код для отмены регистрации фоновой задачи.
Это должно работать в обычном режиме. Однако если я остановлю все процессы в VS Debugger, фоновая задача немедленно остановится, не достигнув блока finally. Для этой цели я объявляю переключатель компиляции, который во время разработки всегда отменяет регистрацию моей фоновой задачи перед запуском.
Однако эта задача может быть зарегистрирована, но не запущена (возможно, она вышла из строя и остановилась), и ее регистрация могла быть отменена во время работы.