У меня есть урезанное Windows 10 Universal App (VS2015) с фоновой задачей, которая должна обновлять живую плитку, но она, похоже, не работает. Я создал базовую страницу XAML с двумя кнопками: «Включить» и «Отключить». Кнопка включения регистрирует фоновое задание, а кнопка отключения отключает ее.win10 универсальное приложение фоновая задача не работает
Код для основного приложения (App6) MainPage.cs файл:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.ApplicationModel.Background;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace App6
{
public sealed partial class MainPage : Page
{
private string TN = "APP6_TASK";
private string TEP = "App6BackgroundTask2.BackgroundTaskHelper";
public MainPage()
{
InitializeComponent();
}
private void Enable(object sender, RoutedEventArgs e)
{
try { RegisterTask(); }
catch(Exception ex) { ShowDialog(ex.ToString()); }
}
private void Disable(object sender, RoutedEventArgs e)
{
try { UnregisterTask(); }
catch (Exception ex) { ShowDialog(ex.ToString()); }
}
private async void ShowDialog(string message)
{
var dlg = new MessageDialog(message);
await dlg.ShowAsync();
}
public void RegisterTask()
{
//no need to register a task that already exists
if (GetTask()) { return; }
var backgroundTaskBuilder = new BackgroundTaskBuilder() { Name = TN, TaskEntryPoint = TEP };
backgroundTaskBuilder.SetTrigger(new TimeTrigger(15, false));
backgroundTaskBuilder.Register();
}
public void UnregisterTask()
{
var task = new KeyValuePair<Guid, IBackgroundTaskRegistration>();
//no need to unregister a task that doesn't exist
if (GetTask(ref task))
{
task.Value.Unregister(true);
}
}
public bool GetTask()
{
foreach (var t in BackgroundTaskRegistration.AllTasks)
{
if (t.Value.Name == TN)
{
return true;
}
}
return false;
}
public bool GetTask(ref KeyValuePair<Guid, IBackgroundTaskRegistration> task)
{
foreach (var t in BackgroundTaskRegistration.AllTasks)
{
if (t.Value.Name == TN)
{
task = t;
return true;
}
}
return false;
}
}
}
Я открыл Package.AppManifest файл, добавил «Фоновые операции» заявление на вкладке «Объявления» и выбран " Timer ". Для введенной точки I введено
App6BackgroundTask2.BackgroundTaskHelper
Я добавил второй проект к решению и сделал ссылку на него из основного приложения. Код для единственного класса в этом проекте (BackgroundTaskHelper.cs) является:
using System;
using System.Diagnostics;
using Windows.ApplicationModel.Background;
using Windows.Data.Xml.Dom;
using Windows.UI.Notifications;
namespace App6BackgroundTask2
{
public sealed class BackgroundTaskHelper : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
var backgroundTaskDeferral = taskInstance.GetDeferral();
try { UpdateTile(); }
catch (Exception ex){ Debug.WriteLine(ex); }
finally { backgroundTaskDeferral.Complete(); }
}
private void UpdateTile()
{
var now = DateTime.Now.ToString("HH:mm:ss");
var xml =
"<tile>" +
" <visual>" +
" <binding template='TileSmall'>" +
" <text>" + now + "</text>" +
" </binding>" +
" <binding template='TileMedium'>" +
" <text>" + now + "</text>" +
" </binding>" +
" <binding template='TileWide'>" +
" <text>" + now + "</text>" +
" </binding>" +
" <binding template='TileLarge'>" +
" <text>" + now + "</text>" +
" </binding>" +
" </visual>" +
"</tile>";
var tileDom = new XmlDocument();
tileDom.LoadXml(xml);
var tile = new TileNotification(tileDom);
TileUpdateManager.CreateTileUpdaterForApplication().Update(tile);
}
}
}
Я запустить основное приложение в режиме отладки, щелкнули «Включить», чтобы зарегистрировать фоновую задачу, подвешенный задачу из Debug .Закрыть панель инструментов и проверить, запущен ли метод выполнения и не генерирует исключение. Плитка обновляется, как и ожидалось, когда я проверяю меню «Пуск». Когда я закрываю приложение и жду, плитка никогда не обновляется снова.
Я удалил приложение, перекомпилировал его как выпуск и запустил его из меню «Пуск» (не работает в среде IDE). Я нажал кнопку «Включить», чтобы зарегистрировать фоновое задание, закрыл приложение и ждал. Плитка никогда не обновлялась.
Кажется, что у меня что-то не хватает, но я не могу понять, что. Любая помощь приветствуется. Thanx
Я думаю, 'System event' сделал это для меня. Но я где-то читал в своих исследованиях, что рекомендуется отменить регистрацию и зарегистрировать новую задачу при каждом запуске приложения. Это может быть проблемой после обновлений версии. – Matt