背景工作是 Windows 10 上的一種方法,用於在背景執行程序代碼。 它們是標準應用程式平臺的一部分,基本上讓應用程式可以註冊系統事件(作為觸發條件),並在該事件發生時在背景中運行預先定義的程式碼區塊。 系統觸發因素包括例如網路連線或系統時區的變動這類事件。
在某些情況下,提供的系統觸發程式不足以解決合作夥伴案例。 從 Windows 10 版本 1803 開始,為合作夥伴提供更多彈性,並允許在更多情況下使用背景工作,合作夥伴可以建立應用程式可註冊的自定義觸發程式。 自定義觸發程式是在設備驅動器內定義,可用來針對您想要的任何硬體條件引發事件。 引發自定義觸發程式時,您的應用程式可以以與標準應用程式模型完全相同的方式執行背景工作。
實作自定義觸發程式
實作自定義觸發程式有兩個步驟。 具體而言,必須在設備驅動程式或系統服務中定義和引發觸發條件,並且必須創建包含背景任務的應用程式。
建立自定義觸發程式
自定義觸發程式是透過 RtlRaiseCustomSystemEventTrigger 函式在原生服務或設備驅動器內定義和引發。 然後,您可以從通用應用程式註冊它,並用來以與系統定義的觸發程式相對相同的方式起始背景工作。
下列程式代碼摘錄說明如何觸發自訂觸發器。
#define GUID_MY_CUSTOMSYSTEMEVENTTRIGGERID L"{9118718B-FF80-4AFE-BAF1-D88A4525F3AB}"
CUSTOM_SYSTEM_EVENT_TRIGGER_CONFIG triggerConfig;
CUSTOM_SYSTEM_EVENT_TRIGGER_INIT(&triggerConfig,
GUID_MY_CUSTOMSYSTEMEVENTTRIGGERID);
NTSTATUS status = RtlRaiseCustomSystemEventTrigger(&triggerConfig);
在上述程式碼範例中,作為參數傳遞至 RtlRaiseCustomSystemEventTrigger 函式的 GUID 定義了應用程式在建立背景工作時將註冊的觸發器標識。 此標識碼必須是唯一的。
建立背景任務
建立背景工作並註冊自定義觸發器的過程,與用於標準系統觸發器的背景工作過程非常相似。
從建立UWP應用程式開始。
在應用程式指令清單檔案中定義背景工作,如下列範例所示。 請注意,Task 元素的 Type 屬性設定為
"systemEvent"
<Applications> <Application Id="MyBackgroundTaskSample.App" Executable="$targetnametoken$.exe" EntryPoint=" MyBackgroundTaskSample.App"> <Extensions> <Extension Category="windows.backgroundTasks" EntryPoint="MyBackgroundTask.SampleBackgroundTask"> <BackgroundTasks> <Task Type="systemEvent" /> </BackgroundTasks> </Extension> </Extensions> </Application> </Applications>
註冊應用程式以接聽您建立的自訂觸發器,如下列程式碼範例所示。 請注意,具現化 CustomSystemEventTrigger 時所使用的字串必須符合在原生服務或裝置驅動程式中建立觸發程式時所使用的 GUID。
public void InitBackgroundTask() { // Create a new background task builder. BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder(); // Create a new CustomSystemEvent trigger. var myTrigger = new CustomSystemEventTrigger( "{9118718B-FF80-4AFE-BAF1-D88A4525F3AB}", //Trigger Identifier CustomSystemEventTriggerRecurrence.Once); //OneShot // Associate the CustomSystemEvent trigger with the background task builder. taskBuilder.SetTrigger(myTrigger); // Specify the background task to run when the trigger fires. taskBuilder.TaskEntryPoint = MyBackgroundTask.SampleBackgroundTask; // Name the background task. taskBuilder.Name = "fabrikam.audio-jack.connected Task"; // Register the background task. BackgroundTaskRegistration taskRegistration = taskBuilder.Register(); // Associate completed event handler with the new background task. taskRegistration.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted); }
建立背景工作,如下列程式代碼摘錄所示。
namespace MyBackgroundTask { public sealed class SampleBackgroundTask : IBackgroundTask { // Called by the system when it's time to run our task public void Run(IBackgroundTaskInstance instance) { DoWork(); } } }
如需建立、設定及處理背景工作和觸發程式的其他指引,請參閱 快速入門:建立和註冊背景工作。