gbk*_*gbk 5 .net c# background-process windows-store-apps visual-studio-2013
使用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();
}
....
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
也OnComplete没有实现 - 因为我不需要它(或者我必须实现它?)
3. 在清单中声明.
设置能够"是"的吐司:

声明后台任务:

4.检查我想要用于背景的所有方法的功能 - 一切正常和工作
Durring调试一切正常,没有错误/异常,但没有发生任何事情.尝试逐步调试 - 看起来一切都好,想想我在代码中犯了一些错误.
所以问题:我错了,为什么我无法启动必须检查数据的后台任务,如果需要某些条件,则需要采取必要的措施?
编辑
第2部分 - 尝试在新解决方案中实现后台任务.
做了什么:创建新的简单CRC:
namespace Tasks
{
public sealed class Tasks : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
//for checking place debug point
//TODO something
}
}
}
Run Code Online (Sandbox Code Playgroud)
另外在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();
}
Run Code Online (Sandbox Code Playgroud)
结果得到了,这个触发器btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));一切正常 - 我可以进入Run方法,但如果我尝试使用TimeTrigger喜欢
//IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(1, false);
// btb.SetTrigger(everyMinuteTrigger);
Run Code Online (Sandbox Code Playgroud)
什么都没发生 - 等几分钟尝试几次(放置而不是触发注册).
问题 - 为什么?我必须做更多的事情吗?老问题也没有答案......
也尝试将它与我的应用程序一起使用 - 所有工作都是完美的,但只有当我连接到局域网...但为什么它不适用于时间触发?
花一点时间,发现我的问题的根本原因很少:
如果我想使用它并启动,我必须使用我的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));
Run Code Online (Sandbox Code Playgroud)如果我想使用TimeTrigger,在编辑中我会编写代码TimeTrigger(1, false);,但在阅读了一些更详细的文档后发现"时间触发器只接受大于或等于15的值;较小的值在寄存器期间失败".MSDN
此外,如果我想使用TimeTrigger,我必须将LockScreenNotification支持添加到我的应用程序
目前我可以每15分钟启动一次backgroundTask,但这并不是我想要的...所以,关于这个后期的问题 - 我找到了答案,但仍需要更深入地阅读BackgroundTask