首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 8 應用開發實戰:從零建立背景任務完整指南

     編輯:關於.NET

前言

背景任務讓 Windows 8 應用能在應用程式未在前台執行時,仍可處理特定工作。本文完整示範如何建立、註冊、管理一個簡單的背景任務,包含專案架構、觸發條件設定、進度回報與取消機制。

專案架構:Windows 執行階段元件

背景任務必須建立在「Windows 執行階段元件」專案中,輸出為 .winmd 檔案:

using System;
using System.Threading.Tasks;
using Windows.ApplicationModel.Background;
using Windows.Storage;

namespace BackgroundTaskLib
{
    public sealed class Demo : IBackgroundTask
    {
        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            // 取得延遲器,允許非同步操作完成後再結束任務
            BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
            
            // 處理取消事件
            taskInstance.Canceled += taskInstance_Canceled;
            
            try
            {
                taskInstance.Progress = 0;
                
                // 寫入初始進度
                StorageFile file = await ApplicationData.Current.LocalFolder
                    .CreateFileAsync(@"webabcdBackgroundTask\demo.txt", CreationCollisionOption.ReplaceExisting);
                await FileIO.WriteTextAsync(file, "progress: 0, currentTime: " + DateTime.Now.ToString());
                
                // 模擬長時間工作,每 1 秒更新 10% 進度
                for (uint progress = 10; progress <= 100; progress += 10)
                {
                    await Task.Delay(1000);
                    taskInstance.Progress = progress;
                    
                    file = await ApplicationData.Current.LocalFolder.GetFileAsync(@"webabcdBackgroundTask\demo.txt");
                    await FileIO.AppendTextAsync(file, "progress: " + progress + ", currentTime: " + DateTime.Now.ToString());
                }
            }
            finally
            {
                deferral.Complete(); // 完成非同步工作
            }
        }
        
        void taskInstance_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
        {
            // 處理取消原因:Abort、Terminating、LoggingOff、ServicingUpdate
        }
    }
}

前台應用:任務註冊與監控

XAML 介面

<StackPanel Margin="120 0 0 0">
    <TextBlock Name="lblMsg" FontSize="14.667" />
    <Button Name="btnRegister" Content="註冊一個背景任務" Margin="0 10 0 0" Click="btnRegister_Click_1" />
    <Button Name="btnUnregister" Content="取消註冊的背景任務" Margin="0 10 0 0" Click="btnUnregister_Click_1" />
</StackPanel>

核心註冊邏輯

private string _taskName = "demo";
private string _taskEntryPoint = "BackgroundTaskLib.Demo";
private bool _taskRegistered = false;

private void btnRegister_Click_1(object sender, RoutedEventArgs e)
{
    BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
    builder.Name = _taskName;
    builder.TaskEntryPoint = _taskEntryPoint;
    
    // 使用系統觸發器:時區變更
    builder.SetTrigger(new SystemTrigger(SystemTriggerType.TimeZoneChange, false));
    
    // 加入執行條件:網路可用
    builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
    
    BackgroundTaskRegistration task = builder.Register();
    AttachProgressAndCompletedHandlers(task);
    _taskRegistered = true;
    UpdateUI();
}

觸發器與條件完整對照表

觸發器類型說明需鎖定畫面最小間隔
TimeTrigger時間觸發是15 分鐘
MaintenanceTrigger維護觸發否15 分鐘 (非鎖定畫面 2 小時)
SystemTrigger系統事件觸發視事件而定即時
PushNotificationTrigger推播通知觸發是-
ControlChannelTrigger控制通道觸發是-

系統條件類型

  • UserPresent / UserNotPresent - 使用者狀態
  • InternetAvailable / InternetNotAvailable - 網路狀態
  • SessionConnected / SessionDisconnected - 工作階段狀態

進度追蹤與完成處理

private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task)
{
    task.Progress += OnProgress;
    task.Completed += OnCompleted;
}

private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
{
    _taskProgress = args.Progress.ToString();
    UpdateUI();
}

private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
{
    _taskProgress = "完成";
    try 
    {
        args.CheckResult(); // 檢查是否有例外
    }
    catch (Exception ex)
    {
        _taskProgress = ex.ToString();
    }
    UpdateUI();
}

必要的 Manifest 設定

  1. 封裝應用程式清單 → 擴充功能 → 背景任務
  2. 勾選對應觸發器類型 (如系統事件)
  3. 進入點設為完整類別名稱:BackgroundTaskLib.Demo

原始碼下載

Windows8.rar - 包含完整專案原始碼與說明文件 Introduction_to_Background_Tasks.docx

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved