背景任務讓 Windows 8 應用能在應用程式未在前台執行時,仍可處理特定工作。本文完整示範如何建立、註冊、管理一個簡單的背景任務,包含專案架構、觸發條件設定、進度回報與取消機制。
背景任務必須建立在「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
}
}
}
<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();
}
BackgroundTaskLib.DemoWindows8.rar - 包含完整專案原始碼與說明文件 Introduction_to_Background_Tasks.docx