C# 背景任务自发完成#

C# 背景任务自发完成#,c#,windows-runtime,windows-phone-8.1,background-process,background-task,C#,Windows Runtime,Windows Phone 8.1,Background Process,Background Task,注册后台任务: string myTaskName = "Task"; foreach (var cur in BackgroundTaskRegistration.AllTasks) if (cur.Value.Name == myTaskName) { return; } await BackgroundExecutionManager.RequestAccessAsync(); Backg

注册后台任务:

    string myTaskName = "Task";

   foreach (var cur in BackgroundTaskRegistration.AllTasks)
        if (cur.Value.Name == myTaskName)
        {
           return;
        }

   await BackgroundExecutionManager.RequestAccessAsync();

   BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder 
   { 
        Name = "Task", 
        TaskEntryPoint = "Background.Task"
   };
   taskBuilder.SetTrigger(new TimeTrigger(15, true));
   BackgroundTaskRegistration myFirstTask = taskBuilder.Register();
后台任务在Windows运行时组件中作为单独的类创建:

public sealed class Task : IBackgroundTask 
        {
            public async void Run(IBackgroundTaskInstance taskInstance)
            {
                BackgroundTaskDeferral deferral = taskInstance.GetDeferral();

//logic, send http get request, connect to db

                deferral.Complete();
            }
}
当需要执行任务时-它可能会随机运行多次(1-15次),然后自动终止,不再启动,要解决此问题,需要重新注册任务。原因可能是什么


VS在需要运行任务时显示此错误:

在Windows Phone上定期执行后台任务,间隔至少30分钟

Windows有一个内置计时器,每隔15分钟运行一次后台任务请注意,在Windows Phone上,间隔为30分钟。

(来源:)

如果我是你,我会将时间间隔改为更安全的时间间隔(例如60分钟)-你可以在以后尝试更小的时间间隔。然后查看
oneShot
标志,在您的案例中,该标志设置为
true
。将其设置为
false
可使任务运行多次

此外,您的异常看起来并不健康。你说它甚至在后台任务为空的情况下发生-为了安全起见,你应该修复它

我建议您使用VisualStudio中的生命周期功能手动启动和调试Backgound任务几次。也许还有其他原因导致你的任务失败


但首先检查间隔。

我不知道Win 8.0/8.1上的新应用程序中的间隔是如何实现的,但在WinPhone上,每个任务/作业都有一些运行时限制:最大内存使用量和最大单次运行时间都是有限的。当超过任何这些度量值时,任务/作业将被终止并禁用其计划,直到重新运行应用程序并从头开始重新计划任务。在WinPhone框架上,限制非常严格,哦,任务/作业中出现的任何未经处理的异常也会立即导致其计划被取消。@Quetzalcatl,win phone 8.1上的应用程序。这不是因为记忆上的压力。我结束了toast通知,而不是logic batskground任务。还有一个错误:CReason是一个argumentexception,正如您在屏幕截图中看到的那样。@Jehof,不,这不是原因。如果后台任务为空-我也会收到此错误。Try/catch无法捕获此错误。我不知道这个错误是怎么产生的。好的,我会试试。谢谢解决这个问题:taskBuilder.SetTrigger(newtimetrigger(15,FALSE));一杆必须是假的,你可以设置时间为15分钟。现在你已经指出了,我知道我想补充我的答案。当我看到你的问题时,我想:“一枪是真的——那不可能是对的”,但在发布我的答案时,我完全忘记了这一点:)我将编辑帖子以反映这一点。