我正在開發專爲手機設計的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。嘆。一個時代的終結。 –