win10通用app后台任务不运行
win10 universal app background task not running
我有一个精简的 Windows 10 Universal App (VS2015),它有一个后台任务,应该更新动态磁贴,但它似乎不起作用。我创建了一个带有两个按钮的基本 XAML 页面:"Enable" 和 "Disable"。启用按钮注册后台任务,禁用按钮注销它。
主应用程序(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 文件,在 "Declarations" 选项卡下添加了 "Background Tasks" 声明并选择了 "Timer" 任务类型。对于我输入的入口点
App6BackgroundTask2.BackgroundTaskHelper
我向解决方案添加了第二个项目,并从主要应用程序中引用了它。该项目中唯一的 class (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);
}
}
}
我 运行 主应用程序处于调试模式,单击 "Enable" 注册后台任务,从 Debug.Location 工具栏暂停任务并验证任务的 运行 方法执行并且不抛出异常。当我检查“开始”菜单时,磁贴会按预期更新。当我关闭应用程序并等待时,磁贴再也不会更新。
我卸载了该应用程序,重新编译为 Release 并从开始菜单 运行 它(不是 运行ning 在 IDE 中)。我点击了"Enable"按钮注册了后台任务,关闭了应用等待。磁贴从未更新。
我好像漏掉了什么,但我不知道是什么。任何帮助表示赞赏。谢谢
我找到了答案。
我在 package.appxmanifest 的“声明”选项卡中 select 编辑了 "System event" 任务类型(除了 "Timer" 任务类型)。
我还 select编辑 "Badge and Tile Text" 用于“应用程序”选项卡中的 "Lock screen notifications" select 框。
我 select 编辑 "Assets\LockScreenLogo.png" 视觉资产选项卡中的徽章徽标。
最后,我修改了注册任务例程
public async Task RegisterTask()
{
var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();
if (backgroundAccessStatus == BackgroundAccessStatus.Denied) { return; }
if (GetTask()) { return; }
var timeTrigger = new TimeTrigger(15, false);
var backgroundTaskBuilder = new BackgroundTaskBuilder();
backgroundTaskBuilder.Name = TASK_NAME;
backgroundTaskBuilder.TaskEntryPoint = typeof(BackgroundTileTimerTask.BackgroundTask).FullName;
backgroundTaskBuilder.SetTrigger(timeTrigger);
backgroundTaskBuilder.Register();
}
这似乎成功了。
我已将代码和如何将 PDF 添加到 GitHub:GitHub repository
我有一个精简的 Windows 10 Universal App (VS2015),它有一个后台任务,应该更新动态磁贴,但它似乎不起作用。我创建了一个带有两个按钮的基本 XAML 页面:"Enable" 和 "Disable"。启用按钮注册后台任务,禁用按钮注销它。
主应用程序(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 文件,在 "Declarations" 选项卡下添加了 "Background Tasks" 声明并选择了 "Timer" 任务类型。对于我输入的入口点
App6BackgroundTask2.BackgroundTaskHelper
我向解决方案添加了第二个项目,并从主要应用程序中引用了它。该项目中唯一的 class (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);
}
}
}
我 运行 主应用程序处于调试模式,单击 "Enable" 注册后台任务,从 Debug.Location 工具栏暂停任务并验证任务的 运行 方法执行并且不抛出异常。当我检查“开始”菜单时,磁贴会按预期更新。当我关闭应用程序并等待时,磁贴再也不会更新。
我卸载了该应用程序,重新编译为 Release 并从开始菜单 运行 它(不是 运行ning 在 IDE 中)。我点击了"Enable"按钮注册了后台任务,关闭了应用等待。磁贴从未更新。
我好像漏掉了什么,但我不知道是什么。任何帮助表示赞赏。谢谢
我找到了答案。
我在 package.appxmanifest 的“声明”选项卡中 select 编辑了 "System event" 任务类型(除了 "Timer" 任务类型)。
我还 select编辑 "Badge and Tile Text" 用于“应用程序”选项卡中的 "Lock screen notifications" select 框。
我 select 编辑 "Assets\LockScreenLogo.png" 视觉资产选项卡中的徽章徽标。
最后,我修改了注册任务例程
public async Task RegisterTask()
{
var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();
if (backgroundAccessStatus == BackgroundAccessStatus.Denied) { return; }
if (GetTask()) { return; }
var timeTrigger = new TimeTrigger(15, false);
var backgroundTaskBuilder = new BackgroundTaskBuilder();
backgroundTaskBuilder.Name = TASK_NAME;
backgroundTaskBuilder.TaskEntryPoint = typeof(BackgroundTileTimerTask.BackgroundTask).FullName;
backgroundTaskBuilder.SetTrigger(timeTrigger);
backgroundTaskBuilder.Register();
}
这似乎成功了。
我已将代码和如何将 PDF 添加到 GitHub:GitHub repository