13

我正在编写一个只能在 PC 上运行的 Metro 应用程序(因此不用担心电池寿命,或者至少不用担心)。当用户单击按钮时,我需要它来注册和运行后台任务。它注册得很好,但我发现没有办法让它在延迟 15 分钟后运行,这对这个应用程序来说毫无用处。有什么想法可以让它立即运行吗?

我也在这里发现了一个类似的问题,说不可能,但一定有人想出了办法。

编辑:

我要求这项任务的理由是这样的:

我的应用程序将读取和写入文件,因为它们会在很长一段时间内出现,从几分钟到几小时不等。在大多数时间里,应用程序不太可能出现在前台。因为我需要代码才能继续执行,所以似乎最好的方法是创建一个后台任务,但我找不到在 Visual Studio 之外手动启动此任务的方法,尽管在 Visual Studio 中它可以完美运行。如果有更合适的方式来处理这个执行,我愿意使用它。

4

5 回答 5

6

编辑

由于来自 OP 的额外信息而进行的修订。

我认为您可以通过 Metro 应用程序做到这一点的唯一方法是要求您的用户将您的应用程序“捕捉”到桌面 - 在您捕捉的应用程序上,他们可以点击启动/停止并同时仅使用桌面进行携带两个应用程序都在前台运行。


我认为我的其他答案不完整,因此我将尝试提供更好的答案。

澄清一下:您声明使用后台任务的全部原因是即使您的应用程序被暂停,您的应用程序也将继续运行一些代码。

后台任务:

您无法触发 WinRT 后台任务立即运行。

请记住,默认情况下,后台任务每 2 小时有 1 秒的 CPU 使用时间,并且无法指定何时激活 - 您只能使用机会触发 - 在这种情况下对您没有好处。

此外,即使您的应用程序是锁屏应用程序,您也不能指定立即处理后台任务,除非您使用推送通知,这不适合您尝试执行的操作。对于锁屏应用程序,您通常每 15 分钟获得 2 秒的 CPU。

挂起:

但是,如果您的应用程序被暂停,您仍然有几秒钟(5,根据此:http ://www.redlist.ch/post/Time-limit-on-suspending-a-WinRT-app.aspx )在您的应用程序被操作系统暂停之前进行整理。无论如何,此暂停宽限时间都比您在后台任务中的时间长!

因此,我建议不要使用后台任务,而是启动一个后台线程(根据我的其他答案)来执行您的按钮按下操作(使用本地状态来记录其进度)。现在,如果您还挂钩到 App onsuspending 事件,您可以使用它来查看按钮按下操作是否尚未完成并完成它。

希望这是有道理的。祝你好运!

于 2013-01-14T11:26:46.717 回答
6

我解决这个问题的方法是创建一个可以从应用程序和后台任务调用的通用函数。

在您的情况下,当用户单击注册按钮时,您可以注册任务,然后调用通用功能(从您的应用程序)。任务运行时,也可以调用相同的常用函数。

于 2013-01-07T14:52:07.123 回答
2

如果您基于 UI 操作(按钮按下)运行任务,您也可以挂钩到按钮按下事件并在 UI 进程的新线程中启动您的任务。例如

new TaskFactory().StartNew(() => YourBackgroundTaskMethod())

您不会阻塞 UI,如果需要,您可以轻松地将后台线程的结果编组回 UI。

这样您就不必依赖您的应用程序被提升为锁屏应用程序 - 如果您想运行后台计时器任务,这是一项要求。

于 2013-01-09T14:24:36.020 回答
2

似乎您的用例最能从通知系统中受益。您可以在创建文件时向您的应用程序发送通知(从文件创建服务或通过云服务与您的应用程序通信的桌面端 .Net 4.5 应用程序)。

关于一般的后台工作,您可以使用Windows.UI.Notifications.ScheduledTileNotification安排每分钟更改一次磁贴通知。

于 2013-01-15T16:34:17.380 回答
0

您可以订阅原始推送通知事件。当您想要启动该过程时,您可以请求您的服务器发送原始通知,这将激活您的后台任务。

于 2015-02-10T08:34:50.317 回答