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, он запустит фоновую задачу и покажет уведомление в правом конце вашего окна.