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
}
}
}
在一些示例中,我发现应该在注册任务之前调用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但立即