背景工作和自定義觸發程式
背景工作是在背景中執行程式碼的 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(); } } }
如需建立、設定和使用背景工作和觸發程式的其他指引,請參閱 快速入門:建立和註冊背景工作。