Windows Phone 8.1 выполняет фоновую задачу из приложения (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. Проблема с фоновыми задачами заключается в том, что ОС может убить вашу задачу. Когда это происходит, события плитки больше не обрабатываются, поэтому я хотел бы перезапустить его по запросу пользователя.

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

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


person Lextendo    schedule 08.06.2015    source источник
comment
Итак, вы хотите, чтобы приложение на переднем плане могло вызывать фоновый процесс? Не уверен, что это можно сделать. Вы всегда можете просто скопировать код из фонового процесса, включить его в класс основного приложения и вызвать его. Вероятно, это не тот ответ, который вы искали, но лучшее, что я могу придумать.   -  person kernanb    schedule 09.06.2015
comment
Спасибо @kernanb за ваши мысли. Я думаю, если это невозможно, я должен попробовать другой подход.   -  person Lextendo    schedule 10.06.2015


Ответы (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 для связи между приоритетной и фоновой задачами (если вы хотите установить флаги или запретить выполнение кода только после заданного интервала).

person Fred    schedule 10.06.2015
comment
Проблема не столько в совместном использовании кода. Я согласен, что общий проект мог бы упростить задачу, и поэтому я буду использовать этот подход. Тем не менее, объект mlh находится либо в фоновой задаче, либо на переднем плане. продолжительность жизни объекта mlh ограничена вызывающей стороной. Фоновая задача может быть закрыта ОС. Когда это произойдет, я хочу перезапустить его. Я отредактировал свой первоначальный вопрос, чтобы уточнить. - person Lextendo; 10.06.2015