- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个使用类似于此示例代码的计时器的应用程序:
Sample Code for BackgroundTasks
特别是带有计时器的部分。因此,当我在调试器中启动应用程序时,我的代码按预期运行。事件每分钟都会触发,我会登录到一个文本文件(并进行磁贴通知)。
我的问题是,当我在没有调试的情况下正常运行它时,它运行了四次(有时是五次)然后什么也没有。查看正在运行的进程,我可以看到后台任务,然后它就消失了。我什至已经登录了 OnCancelled,但它从未被调用过。我什至尝试为后台任务创建一个解构函数,看看它是否被调用(并在那里放置一些日志记录),但它似乎没有。似乎也没有异常被抛出,至少它们没有被记录并且我有一个 try catch 绕过计时器。
关于如何追踪后台任务似乎被压缩的原因的建议(我想如果系统要关闭它们,它会取消它们吗?)
更新:我在没有附加调试器的情况下正常运行应用程序,当我看到后台任务进程出现时,我将我的调试器附加到它。它运行了 8 分钟(日志显示之前的运行在四分钟后停止)。当我此时分离调试器时,它又运行了四次(每分钟一次),然后该过程消失了。
更新: 好的,我想我已经弄清楚发生了什么,但不知道为什么。 http://msdn.microsoft.com/en-au/library/windows/apps/hh974425.aspx
When you are not debugging, Windows Process Lifetime Management (PLM) controls the execution state of your app—starting, suspending, resuming, and terminating the app in response to user actions and the state of the device. When you are debugging, Windows disables these activation events.
所以我想这可能会改变我的问题,我如何找出为什么 Backgroundtask 在仍有工作要做时被暂停?
更新: 解决了我的问题,我将 Canceled 处理程序附加到字段变量(在 Run 方法中分配)。将 Canceled 处理程序直接附加到传递到 Run 方法的实例进行了 Cancel 调用工作。我认为这不会有什么不同,因为它引用了同一件事。无论如何,取消原因是“IdleTask”。增加计时器的频率似乎使后台任务不会被取消。
所以现在的问题是有多少工作才不会因空闲而被取消?您能检查一下并进行调整吗?你能覆盖支票吗?我不想只是为了不显得无所事事而工作。这会浪费电池生命周期!
最佳答案
我有类似的问题(并为我的应用找到了可接受的解决方法)。
但您的问题很有趣,但仍未得到解答:
虽然使用 BackgroundTaskDeferral 有时系统会假定任务空闲并取消任务:
BackgroundTaskDeferral defferal = taskInstance.GetDeferral();
while (Task runtime less than 14 minutes and 35 seconds)
{
... do something
// wait 20 seconds
new System.Threading.ManualResetEvent(false).WaitOne(20000);
}
defferal.Complete();
真正的任务有点复杂:).
我也不想为了不显得无所事事而只做工作。
关于c# - 如果 BackgroundTask 看起来空闲(但不是由于非常小的常规工作量),您如何防止它被取消?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26707148/
我是一名优秀的程序员,十分优秀!