2016-06-14 2 views
1

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

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

Вот мой код: В основном проекте, я зарегистрировал фоновую задачу:

private async void initBackgroundTask() 
    { 
     string myTaskName = "Ktask"; 
     var status = await BackgroundExecutionManager.RequestAccessAsync(); 
     // check if task is already registered 
     foreach (var cur in BackgroundTaskRegistration.AllTasks) 
      if (cur.Value.Name == myTaskName) 
      {      
       cur.Value.Unregister(true); 
      } 
     try 
     { 
      // register a new task 
      BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder(); 
      taskBuilder.Name = myTaskName; 
      taskBuilder.TaskEntryPoint = typeof(KBackgroundStuff.KBackgroundTask).ToString(); 
      taskBuilder.SetTrigger(new PushNotificationTrigger()); 

      //taskBuilder.SetTrigger(new TimeTrigger(15, false)); 
      BackgroundTaskRegistration myFirstTask = taskBuilder.Register(); 
      myFirstTask.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted); ; 
      await (new MessageDialog("Task registered")).ShowAsync(); 
     } 
     catch(Exception e) 
     { 
      Debug.WriteLine("trigger " + e.Message); 
     }    
    } 

Handle Завершена событие с фоновой задачи:

private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args) 
    { 
     // TODO: Add code that deals with background task completion. 
     ToastTemplateType toastTemplate = ToastTemplateType.ToastText02; 
     XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate); 
     XmlNodeList textElements = toastXml.GetElementsByTagName("text"); 
     textElements[0].AppendChild(toastXml.CreateTextNode("Notification - Yeah")); 
     textElements[1].AppendChild(toastXml.CreateTextNode("I'm message from your Notification!")); 
     ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(toastXml)); 


    } 

фона Задача:

public sealed class KBackgroundTask : IBackgroundTask 
{ 

    public void Run(IBackgroundTaskInstance taskInstance) 
    { 
     BackgroundTaskDeferral _deferral = taskInstance.GetDeferral(); 
     RawNotification notification = (RawNotification)taskInstance.TriggerDetails; 
     string content = notification.Content; 
     System.Diagnostics.Debug.WriteLine(content);    
     _deferral.Complete(); 
    } 


} 

Пожалуйста, помогите моему основному проекту получить завершенное событие из фона t спросите, когда приложение работает без отладки. Извините за мой английский

ответ

2

Уведомление о тосте не должно отображаться, когда ваше приложение переходит на задний план. В вашем коде вы отправляете уведомления о тостах для обработки событий завершения для фоновой задачи. Однако в Замечания из BackgroundTaskCompletedEventHandler delegate, он заявил, что:

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

Когда ваше приложение перейдет на задний план, оно будет приостановлено, поэтому вы не увидите уведомление тоста.

Когда приложение работает с отладкой, оно работает нормально, основной проект может обрабатывать завершенное событие из фоновой задачи и отображать уведомление Тоста.

Это связано с тем, что при отладке с помощью Visual Studio Visual Studio запрещает Windows приостанавливать приложение, прикрепленное к отладчику. Это позволяет пользователю просматривать пользовательский интерфейс отладки Visual Studio во время работы приложения.

Так что во время отладки ваше приложение на самом деле всегда работает на переднем плане. Для получения дополнительной информации см. How to trigger suspend, resume, and background events for Windows Store apps in Visual Studio.

+0

большое спасибо. В моем приложении я хочу, чтобы фоновая задача получила триггер push-уведомления, и он перезвонит в главный проект, чтобы зарегистрировать сокет. Так как я могу это сделать? – ThangBM

+0

@ThangBM: Мы не можем возобновить фоновое задание формы заявки, когда оно было приостановлено. Для операций сокетов я предлагаю вам обратиться к [Сетевые коммуникации в фоновом режиме] (https://msdn.microsoft.com/en-us/windows/uwp/networking/network-communications-in-the-background). –

+0

Zuo: У меня есть другой вопрос, связанный с фоновой задачей, если можете, пожалуйста, помогите мне ответить на него, спасибо. http://stackoverflow.com/questions/38066145/can-not-call-task-run-at-backgroundtask – ThangBM

Смежные вопросы