Windows10 Dev - выполнение в фоновом режиме

Универсальная платформа Windows (UWP) представляет новые механизмы, которые позволяют приложениям выполнять некоторые функции, пока приложение не работает на переднем плане. UWP также увеличивает возможность приложений увеличивать время выполнения в фоновом режиме дляBackground Tasks and Triggers. Фоновое выполнение - это реальный дополнительный хвост в жизненном цикле приложения.

Важные особенности фоновых задач:

  • Фоновая задача запускается системным или временным событием и может быть ограничена одним или несколькими условиями.

  • Когда запускается фоновая задача, связанный с ней обработчик запускается и выполняет работу фоновой задачи.

  • Фоновая задача может выполняться, даже если приложение, зарегистрировавшее фоновую задачу, приостановлено.

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

  • Фоновое выполнение не гарантируется, поэтому оно не подходит для критически важных функций и возможностей.

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

Создание и регистрация фоновой задачи

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

public sealed class MyBackgroundTask : IBackgroundTask { 
   public void Run(IBackgroundTaskInstance taskInstance){ 
      // write code 
   } 
}

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

var access = await BackgroundExecutionManager.RequestAccessAsync();
 
switch (access) {
 
   case BackgroundAccessStatus.Unspecified: 
      break; 
   case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity: 
      break; 
   case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity: 
      break; 
   case BackgroundAccessStatus.Denied: 
      break; 
   default: 
      break; 
}

Чтобы создать и зарегистрировать фоновую задачу, используйте следующий код.

var task = new BackgroundTaskBuilder {
   Name = "My Task", 
   TaskEntryPoint = typeof(BackgroundStuff.MyBackgroundTask).ToString() 
}; 

var trigger = new ApplicationTrigger(); 
task.SetTrigger(trigger);  
task.Register(); 
 
await trigger.RequestAsync();

Давайте разберемся с простым примером фоновой задачи, выполнив все приведенные ниже шаги.

  • Создайте новый пустой проект UWP ‘UWPBackgroundDemo’ и добавьте одну кнопку в файл XAML.

<Page 
   x:Class = "UWPBackgroundDemo.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:local = "using:UWPBackgroundDemo" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d"> 
	
   <Grid Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}">
      <Button x:Name = "button" Content = "Button" 
         HorizontalAlignment = "Left" Margin = "159,288,0,0" 
         VerticalAlignment = "Top" Click = "button_Click"/> 
   </Grid>
	
</Page>
  • Ниже приводится button click реализация события, в котором регистрируется фоновая задача.

using System; 

using Windows.ApplicationModel.Background; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
 
// The Blank Page item template is documented at 
   http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409  

namespace UWPBackgroundDemo {
 
   /// <summary> 
      /// An empty page that can be used on its own or navigated to within a Frame. 
   /// </summary>
	
   public sealed partial class MainPage : Page {

      public MainPage() {
         this.InitializeComponent(); 
      }  
		
      private async void button_Click(object sender, RoutedEventArgs e) {
         var access = await BackgroundExecutionManager.RequestAccessAsync(); 
		 
         switch (access){ 
            case BackgroundAccessStatus.Unspecified: 
               break; 
            case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity: 
               break; 
            case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity: 
               break; 
            case BackgroundAccessStatus.Denied: 
               break; 
            default: 
               break; 
         } 
			
         var task = new BackgroundTaskBuilder {  
            Name = "My Task", 
            TaskEntryPoint = typeof(BackgroundStuff.MyBackgroundTask).ToString() 
         }; 
			
         var trigger = new ApplicationTrigger(); 
         task.SetTrigger(trigger);  
			
         var condition = new SystemCondition(SystemConditionType.InternetAvailable);  
         task.Register(); 
			
         await trigger.RequestAsync(); 
      } 
   } 
}
  • Теперь создайте другой проект, но на этот раз выберите в меню Компонент среды выполнения Windows (универсальная Windows) и дайте имя Background stuff к этому проекту.

  • Ниже приведен код C #. который содержитMyBackgroundTask имплантация класса, и он запустит фоновую задачу.

using Windows.ApplicationModel.Background; 
using Windows.UI.Notifications; 
 
namespace BackgroundStuff { 
   public sealed class MyBackgroundTask : IBackgroundTask { 
	
      public void Run(IBackgroundTaskInstance taskInstance) {
         SendToast("Hi this is background Task"); 
      } 
		
      public static void SendToast(string message) { 
         var template = ToastTemplateType.ToastText01; 
         var xml = ToastNotificationManager.GetTemplateContent(template); 
         var elements = xml.GetElementsByTagName("Test"); 
         var text = xml.CreateTextNode(message); 
			
         elements[0].AppendChild(text); 
         var toast = new ToastNotification(xml); 
         ToastNotificationManager.CreateToastNotifier().Show(toast); 
      } 
   } 
}
  • Чтобы сделать этот проект доступным в UWPBackgroundDemo проект, щелкните правой кнопкой мыши на References > Add References в обозревателе решений и добавьте BackgroundStuff проект.

  • Теперь перейдем к Package.appxmanifest файл из UWPBackgroundDemo project и добавьте следующую информацию на вкладке «Объявления».

  • Сначала создайте проект фонового материала, затем создайте и выполните UWPBackgroundDemo проект.

  • Когда приведенный выше код скомпилирован и запущен, вы увидите следующее окно.

  • Когда вы щелкаете button, он запустит фоновую задачу и покажет уведомление в правом конце вашего окна.