gpt4 book ai didi

c# - 设备屏幕关闭时 UWP 后台任务 HttpClient 失败

转载 作者:太空狗 更新时间:2023-10-29 21:48:59 28 4
gpt4 key购买 nike

我正在开发专为手机设计的 UWP 应用。它旨在与本地家庭网络上运行的服务器同步数据。此同步可能需要相当长的时间,因此后台任务不是同步数据的最佳位置;它可能需要超过我分配的 30 秒。但是,我们的想法是使用带有计时器触发器的后台任务;它会调用服务器检查是否有任何更新要使用,然后弹出一个 toast 通知询问它是否可以在前台运行以执行同步。

代码运行良好...如果屏幕打开。但是如果屏幕关闭,那么我将永远不会收到任何通知。起初我以为 timertrigger 没有触发,但我在它运行时记录下来,果然,ir 每 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();

所以我认为只有在 Wifi 可用时才会触发计时器。但是当我使用这段代码实际执行 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() 返回“true”,告诉我有可用的网络。但是,当我调用电话时,我仍然收到“无法建立与服务器的连接”。我不知道我在这里做错了什么。

有什么想法吗?

最佳答案

您很可能需要在后台任务注册中指定“IsNetworkRequested”,以便网络在连接待机(屏幕关闭时发生)期间正常运行。

请参阅此处的文档: https://learn.microsoft.com/en-us/uwp/api/Windows.ApplicationModel.Background.BackgroundTaskBuilder

关于c# - 设备屏幕关闭时 UWP 后台任务 HttpClient 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133667/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com