gpt4 book ai didi

c# - 如何将后台任务添加到 Windows 应用商店应用程序

转载 作者:太空狗 更新时间:2023-10-29 22:59:10 32 4
gpt4 key购买 nike

使用 c#、VS 2013

尝试向我的商店应用程序添加一些后台任务(如果我的 Json 文件中的某些数据包含当前日期和时间,则显示 toast 的想法)。

做了什么:

1.创建 Windows 运行时组件,实现 IBackgroundTask,添加对我的 Windows 应用商店应用程序的引用。在 WRC 内部创建包含下一个代码的类:

namespace BackgroundTask
{
public sealed class EventChecker: IBackgroundTask
{
ThreadPoolTimer _periodicTimer = null;
public void Run(IBackgroundTaskInstance taskInstance)
{
_periodicTimer
= ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler(PeriodicTimerCallback), TimeSpan.FromSeconds(30));
}

private void PeriodicTimerCallback(ThreadPoolTimer timer)
{
CheckEventAndShowToast();
}
....
}

2.注册任务:在MainPage.xaml.cs中添加方法OnNavigatedTo注册这个后台任务。代码:

        protected override void OnNavigatedTo(NavigationEventArgs e)
{
navigationHelper.OnNavigatedTo(e);

var taskName = "EventCheckerTask";
if (BackgroundTaskRegistration.AllTasks.Count > 0)
{
foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
if (cur.Value.Name != taskName)
{
BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
builder.Name = taskName;
builder.TaskEntryPoint = "BackgroundTask.EventChecker";
BackgroundTaskRegistration taskToRegister = builder.Register();
}
}
}
else
{
BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
builder.Name = taskName;
builder.TaskEntryPoint = "BackgroundTask.EventChecker";
BackgroundTaskRegistration taskToRegister = builder.Register();
}
}

使用MSDN1 , MSDN2 , MSDN3链接。

还有 OnComplete 没有实现 - 因为我不需要它(或者我无论如何都必须实现它?)

3.在 list 中声明。

将 toast 能力设置为"is":

enter image description here

声明后台任务:

enter image description here

4.检查我想用于背景的所有方法的功能 - 一切正常并工作

在调试期间一切正常,没有错误/异常,但什么也没发生。尝试逐步调试 - 看起来一切正常,我想我在代码中犯了一些错误。

所以问题:我哪里错了,为什么我不能启动必须检查数据并在某些条件符合要求时执行所需操作的后台任务?

编辑


第 2 部分 - 尝试在新解决方案中实现后台任务。

做了什么:创建新的简单 CRC :

namespace Tasks
{
public sealed class Tasks : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
//for checking place debug point
//TODO something
}
}
}

还在 main.xaml.cs 中放置了下一个代码:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
CheckTaskRegistration();
}
private void CheckTaskRegistration()
{
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
if (task.Value.Name == "Tasks")
{
isTaskRegistered = true;
break;
}
}
if (!isTaskRegistered)
{
RegisterBackgroundTask2("Tasks", "Tasks.Tasks");
}
}

private void RegisterBackgroundTask2(string name, string entrypoint)
{
BackgroundTaskBuilder btb = new BackgroundTaskBuilder();
btb.Name = name;
btb.TaskEntryPoint = entrypoint;
//IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(1, false);
// btb.SetTrigger(everyMinuteTrigger);
btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
BackgroundTaskRegistration task = btb.Register();
}

得到的结果是,有了这个触发器 btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false)); 一切正常 - 我可以进入 Run 方法,但是如果我尝试像

这样使用 TimeTrigger
       //IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(1, false);
// btb.SetTrigger(everyMinuteTrigger);

什么都没有发生 - 等待几分钟尝试几次(而不是放置 prev 触发器注册)。

问题 - 为什么?我必须做更多的事情吗?老问题也没有答案......

也尝试将它与我的应用程序一起使用 - 一切正常,但前提是我连接到局域网...但为什么它不能与时间触发器一起使用?

最佳答案

A 花了一点时间,发现我的问题的根本原因很少:

  1. 如果我想使用和启动我的 BackgroundTask,我必须使用一些触发器。这里的问题不是我需要的东西存在(或者我可能需要阅读更多关于触发器的内容)。所以如果我添加一些触发器,BackgroundTask 可以在此类事件发生后启动。示例:

    //Time trigger
    IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(15, false);
    btb.SetTrigger(everyMinuteTrigger);

    //one of the standart tirgger
    btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
  2. 如果我想使用 TimeTrigger,在编辑中我用 TimeTrigger(1, false); 编写代码,但在阅读了一些更详细的文档后发现“时间触发器只接受值大于或等于 15;较小的值在注册期间失败。” MSDN

  3. 此外,如果我想使用 TimeTrigger,我必须向我的应用添加 LockScreenNotification 支持

目前我可以每 15 分钟启动一次 backgroundTask,但这并不是我想要的...所以,关于这个帖子 - 我找到了答案,但仍然需要更深入地阅读 BackgroundTask

关于c# - 如何将后台任务添加到 Windows 应用商店应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22698669/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com