锁定设备屏幕时运行的C#Windows 8.1后台任务

锁定设备屏幕时运行的C#Windows 8.1后台任务,c#,win-universal-app,C#,Win Universal App,在过去的一周里,我做了很多工作,为一个windows通用项目创建后台任务。我遇到了一个困难,我开始相信,当设备屏幕被锁定时,不可能触发后台任务运行。我正在使用SystemTriggerType.Useraway触发后台任务。我会把我目前掌握的东西发出去。这方面的任何帮助都会很棒 下面是我如何注册后台任务的 public static void RegisterTask() { try { var taskRegistered

在过去的一周里,我做了很多工作,为一个windows通用项目创建后台任务。我遇到了一个困难,我开始相信,当设备屏幕被锁定时,不可能触发后台任务运行。我正在使用SystemTriggerType.Useraway触发后台任务。我会把我目前掌握的东西发出去。这方面的任何帮助都会很棒

下面是我如何注册后台任务的

    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