如何在 UWP 中每天午夜在后台 运行 一些代码?
How to run some code every day at midnight in background in UWP?
我认为标题不言自明:我每天都在努力启动后台任务,例如在午夜。该任务使用 TimeTrigger 正确注册,添加到 Manifest 但结果各不相同,有时它仅在 phone 上触发,有时仅在 PC 上触发,有时根本不会触发。
请告诉我正确的做法是什么。我在我的应用程序中完成了除此之外的所有内容。
提前致谢。
编辑:我现在的做法是使用 2 个后台任务:每个都使用一个 TimeTrigger,第一个设置为 运行 在午夜执行一次,它的唯一用途是将第二个任务安排到运行 每 24 小时一次。但是正如我之前所说,它并没有像预期的那样工作。
OS 可以 cancel/terminate 有或没有通知的后台任务。
例如...如果注册一个15分钟间隔的bgtask并实现任务取消,您可能会看到该任务在一天内被取消了几次。
我的建议是...尝试在 'midnight' 内多次 运行 bgtask 以解决任务取消问题。
- 在您的 bgtask 中执行取消。
- 以 1 小时间隔注册您的任务。
- 在任务开始时,检查时间和标志,如果时间是'midnight'并且没有设置标志,则执行任务。
- 在本地设置中设置 'done' 标志。
后台取消的详细信息在这里。
https://msdn.microsoft.com/en-us/windows/uwp/launch-resume/handle-a-cancelled-background-task
我的回答可能对您有所帮助
Timetrigger not firing backgroundtask UWP
这是我对 bgtask 的实现。支持取消。
public async void Run(IBackgroundTaskInstance taskInstance)
{
string dbgout = "";
var startTime = DateTime.Now;
dbgout += "BgTask ";
var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
var cancel = new System.Threading.CancellationTokenSource();
taskInstance.Canceled += (s, e) =>
{
dumpLog("Canceled.");
cancel.Cancel();
cancel.Dispose();
};
try
{
_deferral = taskInstance.GetDeferral();
dbgout += cost.ToString() + " ";
switch (cost)
{
case BackgroundWorkCostValue.Low:
case BackgroundWorkCostValue.Medium:
await TimeConsumedTaskLowMidAsync().AsTask(cancel.Token);
break;
case BackgroundWorkCostValue.High:
await TimeConsumedTaskHighAsync().AsTask(cancel.Token);
break;
default:
break;
}
}
catch (Exception e)
{
dbgout += ("Failed " + e.Message + "...");
}
finally
{
dumpLog(dbgout + " " + (DateTime.Now - startTime).TotalSeconds.ToString("F1"));
_deferral.Complete();
}
}
我认为标题不言自明:我每天都在努力启动后台任务,例如在午夜。该任务使用 TimeTrigger 正确注册,添加到 Manifest 但结果各不相同,有时它仅在 phone 上触发,有时仅在 PC 上触发,有时根本不会触发。
请告诉我正确的做法是什么。我在我的应用程序中完成了除此之外的所有内容。
提前致谢。
编辑:我现在的做法是使用 2 个后台任务:每个都使用一个 TimeTrigger,第一个设置为 运行 在午夜执行一次,它的唯一用途是将第二个任务安排到运行 每 24 小时一次。但是正如我之前所说,它并没有像预期的那样工作。
OS 可以 cancel/terminate 有或没有通知的后台任务。 例如...如果注册一个15分钟间隔的bgtask并实现任务取消,您可能会看到该任务在一天内被取消了几次。
我的建议是...尝试在 'midnight' 内多次 运行 bgtask 以解决任务取消问题。
- 在您的 bgtask 中执行取消。
- 以 1 小时间隔注册您的任务。
- 在任务开始时,检查时间和标志,如果时间是'midnight'并且没有设置标志,则执行任务。
- 在本地设置中设置 'done' 标志。
后台取消的详细信息在这里。 https://msdn.microsoft.com/en-us/windows/uwp/launch-resume/handle-a-cancelled-background-task
我的回答可能对您有所帮助 Timetrigger not firing backgroundtask UWP
这是我对 bgtask 的实现。支持取消。
public async void Run(IBackgroundTaskInstance taskInstance)
{
string dbgout = "";
var startTime = DateTime.Now;
dbgout += "BgTask ";
var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
var cancel = new System.Threading.CancellationTokenSource();
taskInstance.Canceled += (s, e) =>
{
dumpLog("Canceled.");
cancel.Cancel();
cancel.Dispose();
};
try
{
_deferral = taskInstance.GetDeferral();
dbgout += cost.ToString() + " ";
switch (cost)
{
case BackgroundWorkCostValue.Low:
case BackgroundWorkCostValue.Medium:
await TimeConsumedTaskLowMidAsync().AsTask(cancel.Token);
break;
case BackgroundWorkCostValue.High:
await TimeConsumedTaskHighAsync().AsTask(cancel.Token);
break;
default:
break;
}
}
catch (Exception e)
{
dbgout += ("Failed " + e.Message + "...");
}
finally
{
dumpLog(dbgout + " " + (DateTime.Now - startTime).TotalSeconds.ToString("F1"));
_deferral.Complete();
}
}