C# win10通用应用程序后台任务未运行

C# win10通用应用程序后台任务未运行,c#,windows-10-universal,C#,Windows 10 Universal,我有一个精简的Windows10Universal应用程序(VS2015),它有一个后台任务,应该是更新一个实时互动程序,但它似乎不起作用。我用两个按钮创建了一个基本的XAML页面:“启用”和“禁用”。启用按钮注册后台任务,禁用按钮取消注册 主应用程序(App6)MainPage.cs文件的代码: using System; using System.Collections.Generic; using System.Threading.Tasks; using Windows.Applicat

我有一个精简的Windows10Universal应用程序(VS2015),它有一个后台任务,应该是更新一个实时互动程序,但它似乎不起作用。我用两个按钮创建了一个基本的XAML页面:“启用”和“禁用”。启用按钮注册后台任务,禁用按钮取消注册

主应用程序(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;
        }
    }
}
我在解决方案中添加了第二个项目,并从主应用程序中引用了它。该项目中唯一类(BackgroundTaskHelper.cs)的代码为:

使用系统;
使用系统诊断;
使用Windows.ApplicationModel.Background;
使用Windows.Data.Xml.Dom;
使用Windows.UI.Notifications;
命名空间App6BackgroundTask2
{
公共密封类BackgroundTaskHelper:IBackgroundTask
{
公共无效运行(IBackgroundTaskInstance taskInstance)
{
var backgroundtaskderal=taskInstance.getDeleral();
请尝试{updateile();}
catch(异常ex){Debug.WriteLine(ex);}
最后{backgroundTaskDeleral.Complete();}
}
私有void updateile()
{
var now=DateTime.now.ToString(“HH:mm:ss”);
var-xml=
"" +
"  " +
"    " +
“”+现在+“”+
"    " +
"    " +
“”+现在+“”+
"    " +
"    " +
“”+现在+“”+
"    " +
"    " +
“”+现在+“”+
"    " +
"  " +
"";
var tileDom=new XmlDocument();
LoadXml(xml);
var瓷砖=新瓷砖化(瓷砖化);
TileUpdateManager.CreateTileUpdateForApplication().Update(平铺);
}
}
}
我已在调试模式下运行主应用程序,单击“启用”注册后台任务,从Debug.Location工具栏暂停任务,并验证任务的run方法已执行且未引发异常。当我检查“开始”菜单时,互动程序将按预期更新。当我关闭应用程序并等待时,互动程序将不再更新

我卸载了应用程序,重新编译为发行版,并从“开始”菜单运行它(不在IDE中运行)。我点击“启用”按钮注册后台任务,关闭应用程序并等待。互动程序从未更新过

看来我遗漏了什么,但我不知道是什么。感谢您的帮助。Thanx我找到了答案

我在package.appxmanifest的Declarations选项卡中选择了“System event”任务类型(除了“Timer”任务类型之外)

我还在“应用程序”选项卡的“锁定屏幕通知”选择框中选择了“徽章和平铺文本”

我在VisualAssets选项卡中为徽章徽标选择了“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();
}
这似乎成功了


我已经将代码和how to PDF添加到GitHub中:

我认为
系统事件
为我做到了这一点。但我在研究过程中在某个地方读到,建议在每次应用启动时注销并注册一个新任务。这可能是版本更新后的问题。
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);
        }
    }
}
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();
}