我可以为 UWP 的 BackgroundTask 设置多个触发器吗?
Can I set more than one trigger for a BackgroundTask of UWP?
我在 MSDN 文档中找不到是否只能将一个触发器(使用 SetTrigger() 方法)设置为后台任务或多个。如果我想在计时器上触发任务并以编程方式触发任务,因此我需要 TimerTrigger 和 ApplicationTrigger,该怎么办?也可以使用 AddCondition() 设置多个条件吗?
一个后台任务注册只能有一个触发器,但是,您可以为同一个后台任务注册多个。
您可以有任意多个条件。
例如,此处 MyBackgroundTask
由 TimeTrigger
和 UserPresent
触发,当 Internet 连接可用时。 MyBackgroundTask.Run()
在这两种情况下都会被调用。
public sealed class MyBackgroundTask : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
// your task code here
}
public void Register()
{
RegisterWithTrigger(BackgroundTaskSuffixTime, new TimeTrigger((uint) RefreshInterval.TotalMinutes, false));
RegisterWithTrigger(BackgroundTaskSuffixUserPresent, new SystemTrigger(SystemTriggerType.UserPresent, false));
}
private static IBackgroundTaskRegistration RegisterWithTrigger(string taskSuffix, IBackgroundTrigger trigger)
{
var taskEntryPoint = typeof(MyBackgroundTask).FullName;
var taskName = taskEntryPoint + taskSuffix;
var registration = BackgroundTaskRegistration.AllTasks.Select(x => x.Value).FirstOrDefault(x => x.Name == taskName);
if(registration != null) return registration;
var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = taskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(trigger);
taskBuilder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
return taskBuilder.Register();
}
}
不要忘记在应用程序清单中声明所有适当的触发器:
<Extension Category="windows.backgroundTasks" EntryPoint="Background.MyBackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
<Task Type="timer" />
</BackgroundTasks>
</Extension>
我在 MSDN 文档中找不到是否只能将一个触发器(使用 SetTrigger() 方法)设置为后台任务或多个。如果我想在计时器上触发任务并以编程方式触发任务,因此我需要 TimerTrigger 和 ApplicationTrigger,该怎么办?也可以使用 AddCondition() 设置多个条件吗?
一个后台任务注册只能有一个触发器,但是,您可以为同一个后台任务注册多个。
您可以有任意多个条件。
例如,此处 MyBackgroundTask
由 TimeTrigger
和 UserPresent
触发,当 Internet 连接可用时。 MyBackgroundTask.Run()
在这两种情况下都会被调用。
public sealed class MyBackgroundTask : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
// your task code here
}
public void Register()
{
RegisterWithTrigger(BackgroundTaskSuffixTime, new TimeTrigger((uint) RefreshInterval.TotalMinutes, false));
RegisterWithTrigger(BackgroundTaskSuffixUserPresent, new SystemTrigger(SystemTriggerType.UserPresent, false));
}
private static IBackgroundTaskRegistration RegisterWithTrigger(string taskSuffix, IBackgroundTrigger trigger)
{
var taskEntryPoint = typeof(MyBackgroundTask).FullName;
var taskName = taskEntryPoint + taskSuffix;
var registration = BackgroundTaskRegistration.AllTasks.Select(x => x.Value).FirstOrDefault(x => x.Name == taskName);
if(registration != null) return registration;
var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = taskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(trigger);
taskBuilder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
return taskBuilder.Register();
}
}
不要忘记在应用程序清单中声明所有适当的触发器:
<Extension Category="windows.backgroundTasks" EntryPoint="Background.MyBackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
<Task Type="timer" />
</BackgroundTasks>
</Extension>