我正在开发专为手机设计的UWP应用程序。它旨在将数据与本地家庭网络上运行的服务器进行同步。此同步可能需要一段时间,因此后台任务不是同步数据的最佳位置;它可能需要超过我分配的30秒。然而,这个想法是使用带有定时器触发器的后台任务;它会调用服务器来检查是否有更新消耗,然后弹出一个Toast通知,询问它是否可以在前台运行以执行同步。UWP后台任务HttpClient在设备屏幕关闭时失败
该代码很好...如果屏幕开启。但是,如果屏幕关闭,那么我从来没有收到任何通知。起初,我认为时间触发器没有触发,但是我每次运行都记录下来,并且足够肯定,每15分钟就按时运行一次。我深入了解它,并且失败了。具体来说,它在网络通话中失败; HttpClient.GetAsync,出现以下错误:
"The text associated with this error code could not be found.\r\n\r\nA connection with the server could not be established\r\n"
现在我检查了服务器;它正在运行。我打开屏幕,代码突然再次运行。我已经设置了扳机,仅运行时将未计量的连接可用:
var status = await BackgroundExecutionManager.RequestAccessAsync();
if(status.In(BackgroundAccessStatus.DeniedBySystemPolicy, BackgroundAccessStatus.DeniedByUser))
{
return;
}
var builder = new BackgroundTaskBuilder();
builder.Name = Constants.BackgroundTaskName;
builder.SetTrigger(new TimeTrigger(15, false));
builder.AddCondition(new SystemCondition(SystemConditionType.FreeNetworkAvailable));
BackgroundTaskRegistration task = builder.Register();
所以,我认为这时提供无线网络连接定时器仅被触发。但后来当我真正执行HTTP GET使用此代码:
async protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
if (BackgroundWorkCost.CurrentBackgroundWorkCost == BackgroundWorkCostValue.High)
return;
if (!NetworkInterface.GetIsNetworkAvailable())
return;
base.OnBackgroundActivated(args);
if (args.TaskInstance.Task.Name == Constants.BackgroundTaskName)
{
var cancel = new CancellationTokenSource();
args.TaskInstance.Canceled += (s, e) =>
{
cancel.Cancel();
cancel.Dispose();
};
var deferral = args.TaskInstance.GetDeferral();
try
{
HttpClient client = GetClient();
var response = await client.GetAsync(ConstructUrl(client.BaseAddress, "updates"), cancel.Token);
var info = await ParseHttpResponse<UpdateInformation>(response);
}
catch { }
finally
{
deferral.Complete();
}
}
现在,有趣的是,NetworkInterface.GetIsNetworkAvailable()返回“真”,告诉我有可用的网络。但是,当我拨打电话时,我会收到“与服务器的连接无法建立”。我不知道我在这里做错了什么。
任何想法?
我觉得你的情况下正确的方法是使用[ControlChannelTrigger(https://msdn.microsoft.com/library/windows/apps/hh701032),有你试过吗?还有一个[示例](https://code.msdn.microsoft.com/windowsapps/ControlChannelTrigger-HTTP-9d7a6b3d)。 –
@ Ron Penton:我也遇到了这个问题。你有没有找到解决这个问题的办法? – c2tarun
不,我永远不会。我认为它是内置于系统中的。我尝试了许多不同的手机。实际上,我上周放弃了。最后试用Android。叹。一个时代的终结。 –