Windows10 开发 - 后台执行

通用 Windows 平台 (UWP) 引入了新的机制,允许应用程序在非前台运行时执行某些功能。UWP 还增强了应用程序延长后台任务和触发器后台执行时间的能力。后台执行是应用程序生命周期中真正互补的部分。

后台任务的重要特性包括 −

  • 后台任务由系统或时间事件触发,并可受一个或多个条件约束。

  • 触发后台任务时,其关联的处理程序将运行并执行后台任务的工作。

  • 即使注册后台任务的应用处于暂停状态,后台任务仍可运行。

  • 它们是标准应用程序平台的一部分,本质上为应用程序提供了注册系统事件(触发器)的能力。当该事件发生时,它们会在后台运行预定义的代码块。系统触发器包括网络连接或系统时区变化等事件。

  • 后台执行无法保证,因此不适用于关键功能和特性。

  • 操作系统对同时运行的后台任务数量有限制。因此,即使触发器触发且条件满足,任务仍然无法运行。

创建并注册后台任务

创建一个后台任务类,并将其注册为在应用不在前台时运行。您可以通过编写实现 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>
  • 下面给出了注册了后台任务的按钮点击事件实现。

using System;

using Windows.ApplicationModel.Background;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

// 空白页项目模板的文档位于
   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。

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 >在解决方案资源管理器中添加"引用",并添加 BackgroundStuff 项目。

Background stuff Sec
  • 现在,我们转到 UWPBackgroundDemo 项目的 Package.appxmanifest 文件,并在"声明"选项卡中添加以下信息。

Background stuff
  • 首先构建 Background stuff 项目,然后构建并执行 UWPBackgroundDemo 项目。

  • 编译并执行上述代码后,您将看到以下内容窗口。

背景内容
  • 点击按钮,它将运行后台任务,并在窗口右侧显示通知。