群組背景工作註冊
重要 API
BackgroundTaskRegistrationGroup 類別
背景工作現在可以註冊在一個群組中,您可以將其視為邏輯命名空間。 這種隔離是確保不同的元件的應用程式或其他媒體櫃,不干擾彼此的背景工作註冊很有幫助。
當應用程式及其使用的架構 (或資料庫) 註冊具有相同名稱的背景工作時,應用程式可能會無意中刪除架構的背景工作註冊。 應用程式作者也可能意外刪除框架和庫後台任務註冊,因為他們可以使用 BackgroundTaskRegistration.AllTasks 取消註冊所有已註冊的後台任務。 使用群組時,您可以隔離背景工作註冊,因此不會發生這種情況。
群組功能
- 群組可由 GUID 唯一識別。 它們還可以有一個關聯的友好名稱字串,在偵錯時更容易閱讀。
- 您可以在群組中註冊多個背景工作。
- 在群組中註冊的背景工作不會出現在 BackgroundTaskRegistration.AllTasks 中。 因此,目前使用 BackgroundTaskRegistration.AllTasks 取消註冊其工作的應用程式不會不小心取消註冊群組中註冊的背景工作。 請參閱下方群組中的取消註冊背景工作,以瞭解如何取消註冊已註冊為群組一部分的所有背景觸發程序。
- 每個背景工作註冊都會有一個 Group 屬性來決定它與哪個群組關聯。
- 向群組註冊程序內背景工作將導致啟動透過 BackgroundTaskRegistrationGroup.BackgroundActivated 事件而不是 Application.OnBackgroundActivated。
在群組中註冊背景工作
以下示範如何將背景工作 (在本範例中由時區變更觸發) 註冊為群組的一部分。
private const string groupFriendlyName = "myGroup";
private const string groupId = "3F2504E0-4F89-41D3-9A0C-0305E82C3301";
private const string myTaskName = "My Background Trigger";
public static void RegisterBackgroundTaskInGroup()
{
BackgroundTaskRegistrationGroup group = BackgroundTaskRegistration.GetTaskGroup(groupId);
bool isTaskRegistered = false;
// See if this task already belongs to a group
if (group != null)
{
foreach (var taskKeyValue in group.AllTasks)
{
if (taskKeyValue.Value.Name == myTaskName)
{
isTaskRegistered = true;
break;
}
}
}
// If the background task is not in a group, register it
if (!isTaskRegistered)
{
if (group == null)
{
group = new BackgroundTaskRegistrationGroup(groupId, groupFriendlyName);
}
var builder = new BackgroundTaskBuilder();
builder.Name = myTaskName;
builder.TaskGroup = group; // we specify the group, here
builder.SetTrigger(new SystemTrigger(SystemTriggerType.TimeZoneChange, false));
// Because builder.TaskEntryPoint is not specified, OnBackgroundActivated() will be raised when the background task is triggered
BackgroundTaskRegistration task = builder.Register();
}
}
取消註冊群組中的背景工作
下列說明如何取消註冊註冊為群組一部分的背景工作。 因為在群組中註冊的背景工作不會出現在 BackgroundTaskRegistration.AllTasks 中,所以您必須逐一查看群組、尋找註冊到每個群組的背景工作,然後取消註冊。
private static void UnRegisterAllTasks()
{
// Unregister tasks that are part of a group
foreach (var groupKeyValue in BackgroundTaskRegistration.AllTaskGroups)
{
foreach (var groupedTask in groupKeyValue.Value.AllTasks)
{
groupedTask.Value.Unregister(true); // passing true to cancel currently running instances of this background task
}
}
// Unregister tasks that aren't part of a group
foreach(var taskKeyValue in BackgroundTaskRegistration.AllTasks)
{
taskKeyValue.Value.Unregister(true); // passing true to cancel currently running instances of this background task
}
}
註冊永續性事件
搭配同程序背景工作使用背景工作註冊群組時,背景啟用會導向群組的事件,而不是 Application 或 CoreApplication 物件上的事件。 這使得應用程式中的多個元件能夠處理啟用,而不是將所有啟用程式碼路徑放置在 Application 物件中。 以下介紹如何註冊群組背景啟動事件。 請先檢查 BackgroundTaskRegistration.GetTaskGroup,以判斷群組是否已註冊。 如果沒有,請使用您的識別碼和易記名稱建立新的群組。 然後向群組上的 BackgroundActivated 事件註冊事件處理程式。
void RegisterPersistentEvent()
{
var group = BackgroundTaskRegistration.GetTaskGroup(groupId);
if (group == null)
{
group = new BackgroundTaskRegistrationGroup(groupId, groupFriendlyName);
}
group.BackgroundActivated += MyEventHandler;
}