C# 具有时间触发器错误的WinRT后台任务
我已将我的C# 具有时间触发器错误的WinRT后台任务,c#,windows-runtime,background-process,sqlite-net,winrt-component,C#,Windows Runtime,Background Process,Sqlite Net,Winrt Component,我已将我的背景任务定义如下: public sealed class BackgroundSynchronization:IBackgroundTask { public async void Run(IBackgroundTaskInstance taskInstance) { BackgroundTaskDeferral _deferral = taskInstance.GetDeferral(); //cod
背景任务定义如下:
public sealed class BackgroundSynchronization:IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
//code
//Network Calls
//Updating Local DB (SQLite)
myRepository.Save(entity); // Saves entity in SQLite Table, and Entity has a Current DateTime field too.
deferral.Complete();
}
}
和TaskRegister
类为:
public static class BackgroundTaskRegister {
public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint,string taskName,IBackgroundTrigger trigger,IBackgroundCondition condition)
{
foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
if (cur.Value.Name == taskName)
{
return (BackgroundTaskRegistration)(cur.Value);
}
}
var builder = new BackgroundTaskBuilder();
builder.Name = taskName;
builder.TaskEntryPoint = taskEntryPoint;
builder.SetTrigger(trigger);
if (condition != null)
{
builder.AddCondition(condition);
}
BackgroundTaskRegistration task = builder.Register();
return task;
}
}
我已在我的应用程序中将触发器注册为:
TimeTrigger myTrigger = new TimeTrigger(15, false);
await BackgroundExecutionManager.RequestAccessAsync();
string entryPoint = "BackgroundTask.BackgroundSynchronization";
string taskName = "Example per 15 minute background task";
BackgroundTaskRegistration tsk = BackgroundTaskRegister.RegisterBackgroundTask(entryPoint, taskName, myTrigger, null);
tsk.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
我的应用程序中还有一个OnComplete
方法:
private async void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
{
var settings = ApplicationData.Current.LocalSettings;
var message = settings.Values["backgroundSyncStatus"].ToString();
var folder = ApplicationData.Current.LocalFolder;
StorageFile file;
var x = await File.DoesFileExistInLocalAsync("BackgroundTaskSucceedLog.txt");
if (!x)
file = await folder.CreateFileAsync("BackgroundTaskSucceedLog.txt");
else
file = await ApplicationData.Current.LocalFolder.GetFileAsync("BackgroundTaskSucceedLog.txt");
await Windows.Storage.FileIO.AppendTextAsync(file, message.ToString() + " " + DateTime.Now.ToString() + Environment.NewLine);
}
后台任务触发成功,数据保存到SQLite DBmyRepository.Save(entity)代码>表格仅适用于第一次运行。
我在OnComplete
方法中记录了条目后得出了这个结论
记录器的结果更让我困惑
记录器结果:
2/16/2015 10:51:41 PM <-- Data Saved in SQLite for this entry
2/16/2015 11:07:03 PM
2/16/2015 11:22:26 PM
2/16/2015 11:37:39 PM
2/16/2015 11:52:51 PM
2/17/2015 5:33:00 AM <-- Data Saved in SQLite for this entry
2/16/2015 10:51:41 PM如果您的后台任务占用太多资源,它可能会被系统终止。锁屏应用程序每15分钟只有2秒的CPU时间。您可以在此处获得更多详细信息:
您还可以使用BackgroundTaskCompletedEventArgs中的方法获取后台任务暂停的原因
在任务完成事件处理程序中,可以执行以下操作:
private async void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
{
try
{
args.CheckResult();
}
catch(Exception e)
{
// add a log/breakpoint here
}
}
它至少应该让你了解出了什么问题