2015-06-08 2 views
2

У меня есть приложение с фоном. Эта задача запускается таймером. Когда я регистрирую его, он запускается после запуска таймера (каждый час).windows phone 8.1 выполнить backgroundtask из приложения (timertrigger)

Но мне нравится выполнять задачу «по желанию» тоже. Могу ли мое приложение отправить триггер в фону, чтобы задача выполнялась до истечения срока действия таймера? Или я могу вызвать метод Run из backgroundtask? Как мне это сделать?

Пример кода будет оценен. Это мой метод Run из backgroundtask.

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

} 

EDIT

Я согласен с @fred перенести логику к общему проекту, смежно фон/передний план с изолированным хранилищем.

Проблема заключается в следующем: В группе Microsoft я создал плитку. Плитка содержит сообщения с кнопками. Когда такая кнопка нажата, событие поднимается. Чтобы поймать события, вам необходимо создать экземпляр IBandClient. Проблема с фоновыми задачами заключается в том, что ОС может убить вашу задачу. Когда это происходит, события фрагментации больше не обрабатываются, поэтому я хотел бы перезапустить их на каждый запрос пользователя.

Таким образом, общий проект, безусловно, является способом «информирования» моего переднего плана, что прослушиватель backgrountask по-прежнему активен.

Но остается вопрос: как запустить фоновое задание «одним нажатием кнопки»?

+0

Итак, вы хотите, чтобы приложение на переднем плане могло вызвать фоновый процесс? Не уверен в этом. Вы всегда можете просто скопировать код из фонового процесса и включить его в класс в главном приложении и вызвать его. Вероятно, это не тот ответ, который вы искали, но лучше всего я могу придумать. – kernanb

+0

Спасибо @kernanb за ваши мысли. Я думаю, если это невозможно, я должен попробовать другой подход. – Lextendo

ответ

2

Я думаю, вы идете по неправильному подходу. Вы не должны быть в состоянии выполнить свою фоновое задание вручную. Если ваша фоновая задача и ваш основной проект должны выполнять те же методы, они должны использовать общий проект.

  • Создать общий проект. Поместите логику внутри класса.
  • Ссылка на общий проект как в вашем основном проекте, так и в фоновой задаче
  • Всякий раз, когда выполняется фоновое задание, оно фактически создает экземпляр и вызывает класс из общего проекта. Ваш фон теперь задача становится только оберткой для выполнения и будет реорганизовать к этому:

    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(); 
        } 
    
    } 
    

    Теперь, если вы хотите назвать эту задачу вручную из запущенного foregound приложения, просто выполнить этот код из ViewModel:

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

вы можете использовать IsolatedStorage для связи между передним планом и фоном задачи (если вы хотите установить флаги или предотвратить код, который будет выполняться только по истечении заданного интервала).

+0

Проблема заключается не столько в совместном использовании кода. Я согласен, что общий проект может облегчить ситуацию, и поэтому я буду использовать этот подход.Тем не менее, объект mlh либо находится в фоновой таблице, либо на переднем плане. «продолжительность жизни» объекта mlh ограничена вызывающим. ОС может закрыть фоновая задача. Когда это произойдет, я хочу перезапустить его. Я изменил свой первоначальный вопрос, чтобы уточнить. – Lextendo