锁定设备屏幕时运行的C#Windows 8.1后台任务
在过去的一周里,我做了很多工作,为一个windows通用项目创建后台任务。我遇到了一个困难,我开始相信,当设备屏幕被锁定时,不可能触发后台任务运行。我正在使用SystemTriggerType.Useraway触发后台任务。我会把我目前掌握的东西发出去。这方面的任何帮助都会很棒 下面是我如何注册后台任务的锁定设备屏幕时运行的C#Windows 8.1后台任务,c#,win-universal-app,C#,Win Universal App,在过去的一周里,我做了很多工作,为一个windows通用项目创建后台任务。我遇到了一个困难,我开始相信,当设备屏幕被锁定时,不可能触发后台任务运行。我正在使用SystemTriggerType.Useraway触发后台任务。我会把我目前掌握的东西发出去。这方面的任何帮助都会很棒 下面是我如何注册后台任务的 public static void RegisterTask() { try { var taskRegistered
public static void RegisterTask()
{
try
{
var taskRegistered = false;
var builder = new BackgroundTaskBuilder();
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
if (task.Value.Name == "ResponderBackgroundTask")
{
Debug.WriteLine(task.Value.Name + " Task Already Registered!!");
taskRegistered = true;
break;
}
}
if (!taskRegistered)
{
builder.Name = "ResponderBackgroundTask";
builder.TaskEntryPoint = "BackgroundGps.BackgroundTask";
builder.AddCondition(new SystemCondition(SystemConditionType.UserNotPresent));
builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
builder.SetTrigger(new SystemTrigger(SystemTriggerType.UserAway, false));
builder.CancelOnConditionLoss = true;
var register = builder.Register();
register.Completed += new BackgroundTaskCompletedEventHandler(OnComplete);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
throw;
}
}
以下是背景任务:
async public void Run(IBackgroundTaskInstance taskInstance)
{
taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);
Debug.WriteLine("Inside Run.......");
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
await Geolocate();
deferral.Complete();
}
async static Task<HttpResponseMessage> Geolocate()
{
Debug.WriteLine("Inside Async Geolocate");
HttpResponseMessage response = new HttpResponseMessage();
Geolocator geolocator = new Geolocator();
geolocator.DesiredAccuracy = (PositionAccuracy) 20;
geolocator.DesiredAccuracyInMeters = 30;
var networkStatus = NetworkInformation.GetInternetConnectionProfile();
bool status = true;
while (status)
{
networkStatus = NetworkInformation.GetInternetConnectionProfile();
Geoposition position = await geolocator.GetGeopositionAsync().AsTask();
var latitude = position.Coordinate.Point.Position.Latitude;
var longitude = position.Coordinate.Point.Position.Longitude;
HttpClient client = new HttpClient();
response = await client.GetAsync("http://www.mylocation.com/location?=latitude&longitude");
Debug.WriteLine(response);
if (networkStatus == null)
{
status = false;
}
if (cancelRequest == true)
{
return response;
}
await Task.Delay(15000);
}
return response;
}
异步公共无效运行(IBackgroundTaskInstance taskInstance)
{
taskInstance.Cancelled+=新背景任务CanceledEventHandler(OnCanceled);
Debug.WriteLine(“内部运行…”);
BackgroundTaskDeleral deleral=taskInstance.getDeleral();
等待地理定位();
延迟。完成();
}
异步静态任务地理定位()
{
WriteLine(“内部异步地理定位”);
HttpResponseMessage response=新的HttpResponseMessage();
Geolocator Geolocator=新的Geolocator();
geolocator.DesiredAccuracy=(定位精度)20;
geolocator.DesiredAccuracyInMeters=30;
var networkStatus=NetworkInformation.GetInternetConnectionProfile();
布尔状态=真;
while(状态)
{
networkStatus=NetworkInformation.GetInternetConnectionProfile();
地理位置=等待地理定位器。GetGeopositionAsync().AsTask();
var纬度=位置.坐标.点.位置.纬度;
var经度=位置.坐标.点.位置.经度;
HttpClient=新的HttpClient();
response=wait client.GetAsync(“http://www.mylocation.com/location?=latitude&longitude");
Debug.WriteLine(响应);
if(networkStatus==null)
{
状态=假;
}
if(cancelRequest==true)
{
返回响应;
}
等待任务。延迟(15000);
}
返回响应;
}
当我将
UWP
项目中的后台任务用于推送通知时,我遇到了一些问题
UWP
BackgroundTasks
的主要问题是,它们被认为非常轻,并且不会消耗太多CPU时间,否则操作系统会将其关闭
我的问题是,我试图通过使用非常繁重的服务来访问本地数据库,这需要CPU时间,并且被操作系统关闭。我的日志在一条直线的中间被切断了,因为我的记录器写得不够快。
试着在你的背景任务中放一些日志
,看看他是否被触发,并寻找一个可能导致它被取消的繁重操作
Web请求也可能是问题…当我将其用于推送通知时,我在
UWP
项目中的后台任务遇到了一些问题
UWP
BackgroundTasks
的主要问题是,它们被认为非常轻,并且不会消耗太多CPU时间,否则操作系统会将其关闭
我的问题是,我试图通过使用非常繁重的服务来访问本地数据库,这需要CPU时间,并且被操作系统关闭。我的日志在一条直线的中间被切断了,因为我的记录器写得不够快。
试着在你的背景任务中放一些日志
,看看他是否被触发,并寻找一个可能导致它被取消的繁重操作
网络请求也可能是问题…嘿,伙计,谢谢你的回答!我没有想到后台占用了太多的CPU时间。上面的代码有一个奇怪的行为,如果您注意到我使用的触发器是“UserAway”触发器,它应该在用户离开或设备锁定后触发任务。奇怪的是,任务在设备锁上触发,但它似乎停止了任务线程。解锁后,后台任务将在不应该运行时继续运行,因为此设置条件为“UserNotPresent”。你以前见过这个,或者知道发生了什么吗?我可以看到,你在Windows8.1上运行它,它是电话/电脑吗?检查此链接是否与您相关。它说明在Windows 8.1上,“必须先将应用程序置于锁定屏幕上,然后才能使用此触发器类型成功注册后台任务。”这只是一个PC应用程序。是的,我已经把应用程序放在锁屏上了,顺便说一下,锁屏非常模糊。当我第一次开始这项工作时,我认为“将应用程序放在锁屏上”意味着在实际的锁屏上有一个徽章,因此设备被锁定,你可以在那里找到一个链接到你的应用程序的图标。不是这样的lol。要使应用始终处于锁定屏幕上,我一直在使用Wait BackgroundExecutionManager.RequestAccessAsync()在每次应用启动时请求用户访问。链接,我已经看到:)谢谢你的帮助!!嘿,伙计,谢谢你的回答!我没有想到后台占用了太多的CPU时间。上面的代码有一个奇怪的行为,如果您注意到我使用的触发器是“UserAway”触发器,它应该在用户离开或设备锁定后触发任务。奇怪的是,任务在设备锁上触发,但它似乎停止了任务线程。解锁后,后台任务将在不应该运行时继续运行,因为此设置条件为“UserNotPresent”。你以前见过这个,或者知道发生了什么吗?我可以看到,你在Windows8.1上运行它,它是电话/电脑吗?检查此链接是否与您相关。它说明在Windows 8.1上,“必须先将应用程序置于锁定屏幕上,然后才能使用此触发器类型成功注册后台任务。”这只是一个PC应用程序。是的,我已经把应用程序放在锁屏上了,顺便说一下,锁屏非常模糊。当我第一次开始这项工作时,我认为“将应用程序放在锁屏上”意味着在实际的锁屏上有一个徽章,因此设备被锁定,你可以在那里看到一个图标,那就是lin