註冊背景工作
重要 API
了解如何建立可重複用來安全登錄大多數背景工作的函式。
本主題適用於同處理序背景工作和跨處理序背景工作。 本主題假設您已經有需要註冊的背景工作。 (請參閱 建立並註冊跨處理序執行的背景工作,或建立並註冊同處理序執行的背景工作 ,以取得如何撰寫背景工作的相關資訊)。
本主題會逐步解說註冊背景工作的公用程式函式。 此公用程式函式會先檢查現有註冊,再多次註冊工作,以避免發生多個註冊的問題,而且可以將系統條件套用至背景工作。 本逐步解說包含此公用程式函式的完整實用範例。
注意
通用 Windows 平台應用程式註冊任何背景觸發程序類型之前,必須呼叫 RequestAccessAsync。
為了確保通用 Windows 應用程式在您發行應用程式更新之後繼續正常執行,您必須呼叫 RemoveAccess,然後在應用程式更新後啟動時呼叫 RequestAccessAsync。 如需詳細資訊,請參閱背景任務指南。
定義方法簽章和傳回類型
此方法會採用工作進入點、工作名稱、預先建構的背景工作觸發程序,以及 (選擇性) 背景工作的 SystemCondition。 這個方法會傳回 BackgroundTaskRegistration 物件。
重要
taskEntryPoint
- 對於跨處理序執行的背景工作,這必須建構為命名空間名稱「.」,以及包含背景類別的類別名稱。 此字串區分大小寫。 例如,如果您有「MyBackgroundTasks」命名空間和包含背景類別程式碼的「BackgroundTask1」類別,則 taskEntryPoint
的 字串會是「MyBackgroundTasks.BackgroundTask1」。
如果您的背景工作在與應用程式相同的進程中執行(亦即,同進程背景工作) taskEntryPoint
不應該設定。
public static BackgroundTaskRegistration RegisterBackgroundTask(
string taskEntryPoint,
string name,
IBackgroundTrigger trigger,
IBackgroundCondition condition)
{
// We'll add code to this function in subsequent steps.
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
Platform::String ^ taskEntryPoint,
Platform::String ^ taskName,
IBackgroundTrigger ^ trigger,
IBackgroundCondition ^ condition)
{
// We'll add code to this function in subsequent steps.
}
檢查是否有現有的註冊
檢查工作是否已註冊。 請務必檢查此情況,因為如果多次註冊工作,每次觸發工作時都會執行多次;這可能會使用過多的 CPU 資源並導致非預期的行為。
您可以查詢 BackgroundTaskRegistration.AllTasks 屬性並逐一查看結果,以檢查現有的註冊。 檢查每個執行個體的名稱 – 如果它符合您要註冊的工作名稱,請中斷迴圈並設定旗標變數,讓您的程式碼在下一個步驟中選擇不同的路徑。
注意 使用應用程式唯一的背景工作名稱。 確定每個背景工作都有唯一的名稱。
下列程式碼會使用我們在最後一個步驟中建立的 SystemTrigger 註冊背景工作:
public static BackgroundTaskRegistration RegisterBackgroundTask(
string taskEntryPoint,
string name,
IBackgroundTrigger trigger,
IBackgroundCondition condition)
{
//
// Check for existing registrations of this background task.
//
foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
if (cur.Value.Name == name)
{
//
// The task is already registered.
//
return (BackgroundTaskRegistration)(cur.Value);
}
}
// We'll register the task in the next step.
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
Platform::String ^ taskEntryPoint,
Platform::String ^ taskName,
IBackgroundTrigger ^ trigger,
IBackgroundCondition ^ condition)
{
//
// Check for existing registrations of this background task.
//
auto iter = BackgroundTaskRegistration::AllTasks->First();
auto hascur = iter->HasCurrent;
while (hascur)
{
auto cur = iter->Current->Value;
if(cur->Name == name)
{
//
// The task is registered.
//
return (BackgroundTaskRegistration ^)(cur);
}
hascur = iter->MoveNext();
}
// We'll register the task in the next step.
}
註冊背景工作 (或傳回現有的註冊)
檢查在現有背景工作註冊清單中是否找到此工作。 如果是,請傳回工作的執行個體。
然後,使用新的 BackgroundTaskBuilder 物件註冊工作。 此程式碼應該檢查條件參數是否為 Null,如果不是,請將條件新增至註冊物件。 傳回 BackgroundTaskBuilder.Register 方法所傳回的 BackgroundTaskRegistration。
注意 註冊時會驗證背景工作註冊參數。 如果任何註冊參數無效,則會傳回錯誤。 請確定您的應用程式可正常處理背景工作註冊失敗的案例,如果您的應用程式在嘗試註冊工作之後依賴有效的註冊物件,它可能會當機。 注意 如果您要註冊在與應用程式相同的處理序中執行的背景工作,請傳送
String.Empty
或null
做為taskEntryPoint
參數。
下列範例會傳回現有的工作,或新增程式碼來註冊背景工作 (如果存在,包括選擇性的系統條件):
public static BackgroundTaskRegistration RegisterBackgroundTask(
string taskEntryPoint,
string name,
IBackgroundTrigger trigger,
IBackgroundCondition condition)
{
//
// Check for existing registrations of this background task.
//
foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
if (cur.Value.Name == taskName)
{
//
// The task is already registered.
//
return (BackgroundTaskRegistration)(cur.Value);
}
}
//
// Register the background task.
//
var builder = new BackgroundTaskBuilder();
builder.Name = name;
// in-process background tasks don't set TaskEntryPoint
if ( taskEntryPoint != null && taskEntryPoint != String.Empty)
{
builder.TaskEntryPoint = taskEntryPoint;
}
builder.SetTrigger(trigger);
if (condition != null)
{
builder.AddCondition(condition);
}
BackgroundTaskRegistration task = builder.Register();
return task;
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
Platform::String ^ taskEntryPoint,
Platform::String ^ taskName,
IBackgroundTrigger ^ trigger,
IBackgroundCondition ^ condition)
{
//
// Check for existing registrations of this background task.
//
auto iter = BackgroundTaskRegistration::AllTasks->First();
auto hascur = iter->HasCurrent;
while (hascur)
{
auto cur = iter->Current->Value;
if(cur->Name == name)
{
//
// The task is registered.
//
return (BackgroundTaskRegistration ^)(cur);
}
hascur = iter->MoveNext();
}
//
// Register the background task.
//
auto builder = ref new BackgroundTaskBuilder();
builder->Name = name;
builder->TaskEntryPoint = taskEntryPoint;
builder->SetTrigger(trigger);
if (condition != nullptr) {
builder->AddCondition(condition);
}
BackgroundTaskRegistration ^ task = builder->Register();
return task;
}
完成背景工作註冊公用程式函式
此範例顯示已完成的背景工作註冊函式。 此函式可用來註冊大部分的背景工作,但網路背景工作除外。
//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint,
string taskName,
IBackgroundTrigger trigger,
IBackgroundCondition condition)
{
//
// Check for existing registrations of this background task.
//
foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
if (cur.Value.Name == taskName)
{
//
// The task is already registered.
//
return (BackgroundTaskRegistration)(cur.Value);
}
}
//
// Register the background task.
//
var builder = new BackgroundTaskBuilder();
builder.Name = taskName;
builder.TaskEntryPoint = taskEntryPoint;
builder.SetTrigger(trigger);
if (condition != null)
{
builder.AddCondition(condition);
}
BackgroundTaskRegistration task = builder.Register();
return task;
}
//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(Platform::String ^ taskEntryPoint,
Platform::String ^ taskName,
IBackgroundTrigger ^ trigger,
IBackgroundCondition ^ condition)
{
//
// Check for existing registrations of this background task.
//
auto iter = BackgroundTaskRegistration::AllTasks->First();
auto hascur = iter->HasCurrent;
while (hascur)
{
auto cur = iter->Current->Value;
if(cur->Name == name)
{
//
// The task is registered.
//
return (BackgroundTaskRegistration ^)(cur);
}
hascur = iter->MoveNext();
}
//
// Register the background task.
//
auto builder = ref new BackgroundTaskBuilder();
builder->Name = name;
builder->TaskEntryPoint = taskEntryPoint;
builder->SetTrigger(trigger);
if (condition != nullptr) {
builder->AddCondition(condition);
}
BackgroundTaskRegistration ^ task = builder->Register();
return task;
}