【问题标题】:windows phone 8.1 execute backgroundtask from app (timertrigger)windows phone 8.1 从应用程序执行后台任务(timertrigger)
【发布时间】:2015-06-10 20:14:53
【问题描述】:

我有一个带有后台任务的应用程序。此任务由 timertrigger 触发。当我注册它时,它会在定时器被触发后执行(每小时)。

但我也喜欢“随意”执行任务。我的应用程序可以向后台任务发送触发器,以便在计时器到期之前执行任务吗?或者我可以从后台任务调用 Run 方法吗?我该怎么做?

示例代码将不胜感激。这是我在后台任务中的 Run 方法。

public async void Run(IBackgroundTaskInstance taskInstance)
{
    _deferral = taskInstance.GetDeferral();
    if (!_listening)
    {
        taskInstance.Canceled += taskInstance_Canceled;
        await ... // background logic goes here...
    }
    else
    {
        _deferral.Complete();
    }

}

编辑

我同意 @Fred 将逻辑移至共享项目,将后台/前台与隔离存储进行通信。

问题是这样的: 在 Microsoft Band 上,我创建了一个磁贴。磁贴包含带有按钮的消息。当按下这样的按钮时,会引发一个事件。要捕获事件,您必须实例化一个 IBandClient。后台任务的问题是操作系统可以杀死你的任务。当它这样做时,不再处理磁贴事件,所以我想根据用户请求重新启动它。

因此,共享项目绝对是一种“通知”我的前台后台任务侦听器仍处于活动状态的方式。

但问题仍然存在:如何“单击按钮”启动后台任务?

【问题讨论】:

  • 那么您希望前台的应用程序能够调用后台进程吗?不确定有什么方法可以做到这一点。您总是可以从后台进程中复制代码并将其包含在主应用程序的一个类中并调用它。可能不是您要寻找的答案,但我能想出的最佳答案。
  • 感谢@kernanb 的想法。我想如果不可能的话,我应该尝试不同的方法。

标签: c# windows-phone-8.1 background-task


【解决方案1】:

我认为您选择了错误的方法。您不应该手动执行后台任务。如果您的后台任务和主项目需要执行相同的方法,他们应该使用共享项目。

  • 创建一个共享项目。将逻辑放在一个类中。
  • 在您的主项目和后台任务中引用该共享项目
  • 每当您的后台任务执行时,它实际上都会实例化并调用共享项目中的类。您的后台任务现在仅成为执行的包装器,并将重构为:

    public async void Run(IBackgroundTaskInstance taskInstance)    
    {
        _deferral = taskInstance.GetDeferral();
        if (!_listening)
        {
            taskInstance.Canceled += taskInstance_Canceled;
            SharedProject.MyLogicHelper mlh = new SharedProject.MyLogicHelper();
            await mlh.DoFancyStuff();
        }
        else
        {
            _deferral.Complete();
        }   
    
    }
    

    现在,如果您想从正在运行的前台应用手动调用该任务,只需从您的 ViewModel 执行该代码:

    SharedProject.MyLogicHelper mlh = new SharedProject.MyLogicHelper();
    await mlh.DoFancyStuff();
    

您可以使用 IsolatedStorage 在前台和后台任务之间进行通信(如果您想设置标志或阻止代码仅在给定时间间隔后执行)。

【讨论】:

  • 问题不在于共享代码。我同意共享项目可以使事情变得更容易,因此我将使用这种方法。尽管如此,mlh 对象还是驻留在后台任务和/或前台。 mlh 对象的“寿命”受其调用者的限制。后台任务可以被操作系统关闭。发生这种情况时,我想重新启动它。我已经编辑了我最初的问题以澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
相关资源
最近更新 更多