当前位置: 首页 > 知识库问答 >
问题:

Windows phone app 8.1-后台任务未启动

邓德厚
2023-03-14

windows phone 8.1应用程序中的计时器后台任务仅在应用程序从visual Studio以调试模式运行时激发。但是,如果我在没有调试的情况下启动debug binary,它就不能工作,15分钟后,几个小时后都不能工作。我在windows Phone8.1模拟器和nokia Lumia920上测试了它--同样的结果:在调试会话中它可以工作(它由系统触发,我可以从调试位置工具栏手动触发),但是当应用程序手动启动时什么也没有发生。

我有windows商店应用程序也和时间背景任务工作在它相当好。

为了使用后台任务,我执行了以下操作:

>

  • 在WP8.1项目的清单中,我添加了:

    <Extension Category="windows.backgroundTasks" EntryPoint="data.TimerHandler">
            <BackgroundTasks>
                    <Task Type="timer" />
            </BackgroundTasks>
    </Extension>
    

    在命名空间'data'类MyTimerManager中使用以下方法创建:

    public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint, string taskName, IBackgroundTrigger trigger, IBackgroundCondition condition)
    {
        foreach (var cur in BackgroundTaskRegistration.AllTasks)
        {
            if (cur.Value.Name == taskName)
                return (BackgroundTaskRegistration)(cur.Value);
        }
        var builder = new BackgroundTaskBuilder();
        builder.Name = taskName;
        builder.TaskEntryPoint = taskEntryPoint;
        builder.SetTrigger(trigger);
        if (condition != null)
            builder.AddCondition(condition);
        BackgroundTaskRegistration task = null;
        try
        {
            task = builder.Register();
        }
        catch (Exception e)
        {
            LogError(e);
        }
        return task;
    }
    
    public static bool UnRegisterBackgroundTask(string taskName)
    {
        foreach (var cur in BackgroundTaskRegistration.AllTasks)
        {
            if (cur.Value.Name == taskName)
            {
                ((BackgroundTaskRegistration)cur.Value).Unregister(false);
                return true;
            }
        }
        return false;
    }
    
    public static void setupAlarm()
    {
        TimeTrigger timerTrigger = new TimeTrigger(30, false);
        string entryPoint = "data.TimerHandler";
        string taskName = "TimerHandler task";
        UnRegisterBackgroundTask(taskName);//just in case
        BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, timerTrigger, null);
        Log("RegisterBackgroundTask: " + (task!=null ?task.Name:null));
    }
    
    namespace data
    {
    public sealed class  TimerHandler : IBackgroundTask
    {
        BackgroundTaskDeferral deferral = null;
    
        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            deferral = taskInstance.GetDeferral();
            await BackgroundExecutionManager.RequestAccessAsync();
            await backgroundTimerCallAsync();
            deferral.Complete();
        }
        public static async Task backgroundTimerCallAsync()
        {
            NotificationSender ns = new NotificationSender(false, null, null);
            ns.sendNotification("Timer task msg");//my code which sends notification
        }
    }
    }
    
  • 共有1个答案

    贲言
    2023-03-14

    在一些示例中,我发现应该在注册任务之前调用RequestAccessAsync!这招奏效了。

    在表示必须等到RequestAccessAsync完成之前,我必须在同步代码中调用它,所以我是这样做的:

        BackgroundExecutionManager.RequestAccessAsync.AsTask().ContinueWith(
            (t) => registerMyTasks()).ConfigureAwait(false);
    
     类似资料:
    • 说明 在后台任务中,因为是运行在task进程,所以无法使用协程和协程客户端。如果你要操作数据库或Redis,一定要配置同步的连接池。 配置 项目配置文件中mainServer.configs.task_worker_num一定要配置为大于0,否则无法使用后台任务。 定义任务执行类 <?php namespace Test; use Imi\Task\TaskParam; use Imi\Task

    • 这是我遇到的问题,与设计和实现相关: 我有一个接受 POST 请求的 REST Web 服务。没什么特别的。它当前以同步方式响应。 但是,此web服务将启动一个后台进程,这可能需要很长时间。 我不希望此服务在 30 分钟后响应。 相反,它应该立即向客户端返回一个ack响应,仅此而已(即使在30分钟后,也不会有更多的信息要发送)。 我如何在泽西实施这种行为? 我读了那一页https://jersey

    • 问题内容: 我想知道哪种方法是在Java中实现某种后台任务的最有效方法(我想那将是某种非阻塞线程)。更准确地说- 我有一些Java代码,然后在某个时候需要执行长时间运行的操作。我想做的是在后台执行该操作,以便程序的其余部分可以继续执行,并且当该任务完成时,只需更新一些特定的对象即可。然后,其他组件将检测到此更改。 问题答案: 您应该使用线程池, http://java.sun.com/docs/b

    • 问题内容: 我有一个Django网站,并且一个页面上有一个按钮(或链接),单击该按钮将启动一个运行时间较长的任务。显然,我想将此任务作为后台任务启动,并立即将结果返回给用户。我想使用一种简单的方法来实现此目的,该方法不需要我安装和学习例如Celery这样的全新消息传递体系结构。我不想用celery!我只想使用一种简单的方法,就可以在接下来的半小时左右的时间内进行设置并开始运行。在Django中没有

    • 问题内容: 如何杀死linux中最后一个生成的后台任务? 例: 问题答案: bash中有一个特殊的变量: $!扩展为在后台执行的最后一个进程的PID。

    • 问题内容: 我尝试定期在JavaFX应用程序后台线程中运行,这会修改一些GUI属性。 我想我知道如何使用Task和Service类,并且不知道如何在不使用Thread#sleep()方法的情况下运行此类定期任务。这将是很好,如果我可以使用一些Executor从Executors编造的方法) 我尝试Runnable每5秒运行一次,这会重新启动,javafx.concurrent.Service但立即