我试图在日历条目的结束时间触发后台任务。例如,如果日历条目是下午3点到下午5点,我希望后台任务在下午5点触发,我还希望根据即将到来的日历条目设置另一个时间触发器。在日历输入时间结束时,我将通过查询数据库获取有关下一个日历条目的详细信息,并将结束时间设置为下一次触发时间。 我不确定如何设置时间,因为它每次都会有所不同。到目前为止,这就是我要做的:
//Background Task updated for Live Tile
Windows.Storage.ApplicationDataContainer pageData = Windows.Storage.ApplicationData.Current.LocalSettings;
pageData.Values["Testing"] = DateTime.Now.ToString();
bool taskRegistered = false;
string UpdateTile = "UpdateTile";
// check if task is already registered
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
if (task.Value.Name == UpdateTile)
{
await (new MessageDialog("Task already registered")).ShowAsync();
taskRegistered = true;
break;
}
}
// register a new task
var builder = new BackgroundTaskBuilder();
builder.TaskEntryPoint = "TileUpdaterTask.UpdateTile";
builder.SetTrigger(new TimeTrigger(30, false));
// Windows Phone app must call this to use trigger types (see MSDN)
await BackgroundExecutionManager.RequestAccessAsync();
BackgroundTaskRegistration theTask = builder.Register();
以下是更新实时磁贴的Windows运行时组件类:
public sealed class UpdateTile : IBackgroundTask //XamlRenderingBackgroundTask
{
Windows.Storage.ApplicationDataContainer pageData = Windows.Storage.ApplicationData.Current.LocalSettings;
public void Run(IBackgroundTaskInstance taskInstance)
{
BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
ITileSquare150x150Text01 tileContent = TileContentFactory.CreateTileSquare150x150Text01();
tileContent.TextHeading.Text = "Hello!";
tileContent.TextBody1.Text = pageData.Values["Testing"].ToString();//"One";
tileContent.TextBody2.Text = "Two";
tileContent.TextBody3.Text = "Three";
TileUpdateManager.CreateTileUpdaterForApplication().Update(tileContent.CreateNotification());
_deferral.Complete();
}
}
请告知。
答案 0 :(得分:3)
从头开始:
代码:
using System;
using System.Globalization;
using Windows.ApplicationModel.Background;
using Windows.Storage;
namespace WindowsRuntimeComponent1
{
public sealed class MyBackgroundClass : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
// Get a deferral, to prevent the task from closing prematurely if asynchronous code is still running.
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
// GET THIS INFO
ApplicationDataContainer LocalSettings = ApplicationData.Current.LocalSettings;
double elapsed = (DateTime.Now - Convert.ToDateTime(LocalSettings.Values["time stamp"], CultureInfo.InvariantCulture)).TotalMinutes;
double remainingMinutes = (int) LocalSettings.Values["gap time minutes"] - elapsed;
// SEE IF WE CAN DO IT NOW
if (remainingMinutes > 15)
{
// do something, otherwise, wait for the next one
}
// FINISH UP
deferral.Complete();
}
}
}
代码:
// UNREGISTER THE EXISTING TASK IF IT EXISTS
var myTask = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault(iTask => iTask.Name == "DoSomethingBackground");
if (myTask != null) myTask.Unregister(true);
// REGISTER NEW TASK TO EXECUTE EVERY 30 MINUTES
BackgroundTaskBuilder myTaskBuilder = new BackgroundTaskBuilder() { Name = "DoSomethingBackground", TaskEntryPoint = "WindowsRuntimeComponent1.MyBackgroundClass" };
myTaskBuilder.SetTrigger(new TimeTrigger(30, false));
myTaskBuilder.Register();
// CREATE/RESET THESE VARIABLES
ApplicationData.Current.LocalSettings.Values["gap time minutes"] = 60;
ApplicationData.Current.LocalSettings.Values["time stamp"] = DateTime.Now.ToString(CultureInfo.InvariantCulture);
您可能会遇到这样的情况:当您尝试运行“DoSomethingBackground”时。来自Lifecycle Events的程序突然结束。如果发生这种情况,请删除主应用程序的bin和obj文件,重建所有内容,然后重新附加.winmd文件。这应该让它再次起作用。另外,在后台任务中大量使用Debug.WriteLine()也是一个很好的建议,所以当你执行它时,你可以在输出窗口中跟踪你的代码是什么。最后,请注意使用日期时间格式,并且我建议您在存储日期时使用CultureInfo.InvariantCulture,因为全局格式不同。