2 回答

TA貢獻1794條經(jīng)驗 獲得超8個贊
的BackgroundTransfer類專門在后臺下載數(shù)據(jù)設(shè)計,即使應(yīng)用程序已被暫?;蜿P(guān)閉。
HttpClient 更適合快速完成的非常短的下載。對于像視頻這樣的冗長下載,請使用Windows.Networking.BackgroundTransfer.BackgroundDownloader。如果您需要在下載完成時處理文件,您可以使用該完成作為后臺任務(wù)的觸發(fā)器。
有關(guān)概述和操作方法,請參閱提供的文檔鏈接。https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/BackgroundTransfer 上有一個完整的示例

TA貢獻1799條經(jīng)驗 獲得超8個贊
所以我決定在這里寫下我自己的答案,因為我不確定其他人是否會解決這個問題。我懷疑的一件事是我最近將 C# 語言更新到了 v7.3,因為 VS 2017 在編寫一些代碼時是這樣說的。也許問題與此有關(guān),但到目前為止我的解決方案在最小化狀態(tài)下工作。
我還想在此聲明,我BackgroundTask首先實施以ApplicationTrigger在需要時觸發(fā)該過程來克服這個問題,但老實說這是一種黑客攻擊。看一下代碼:
public static async Task<string> GetBackgroundTaskReturnValue(string apiRequestUrl)
{
StaticItemsHelper.IsBackgroundPlaylistTaskRunning = true;
if (StaticItemsHelper.IsBackgroundPlaylistTaskRunning)
{
for (int seconds = 0; seconds < 20;)
{
if (!StaticItemsHelper.IsBackgroundPlaylistTaskRunning)
{
break;
}
else
{
Task.Delay(1000).Wait();
}
}
}
var request = BackgroundTaskHelper.BackgroundPlaylistTrigger.RequestAsync().GetResults();
if (request == Windows.ApplicationModel.Background.ApplicationTriggerResult.Allowed)
{
SettingsHelper.localSettings.Values[SettingsHelper.BackgroundPlaylistPlaybackURLKey] = apiRequestUrl;
SettingsHelper.localSettings.Values[SettingsHelper.BackgroundPlaylistPlaybackTokenKey] = StaticItemsHelper.CurrentUserAccessToken;
if (SettingsHelper.tempFolder.TryGetItemAsync(SettingsHelper.BackgroundPlaylistPlaybackReturnKey).GetResults() is StorageFile file)
{
await file.DeleteAsync();
}
for (int seconds = 0; seconds < 30;)
{
if (SettingsHelper.tempFolder.TryGetItemAsync(SettingsHelper.BackgroundPlaylistPlaybackReturnKey).GetResults() is StorageFile _rfile)
{
var _returnVal = FileIO.ReadTextAsync(_rfile).GetResults();
if (!string.IsNullOrEmpty(_returnVal.ToString()))
{
await _rfile.DeleteAsync();
SettingsHelper.localSettings.Values.Remove(SettingsHelper.BackgroundPlaylistPlaybackTokenKey);
SettingsHelper.localSettings.Values.Remove(SettingsHelper.BackgroundPlaylistPlaybackURLKey);
StaticItemsHelper.IsBackgroundPlaylistTaskRunning = false;
return _returnVal;
}
}
Task.Delay(2000).Wait();
seconds += 2;
}
}
else if (request == Windows.ApplicationModel.Background.ApplicationTriggerResult.CurrentlyRunning)
{
for (int seconds = 0; seconds < 30;)
{
Task.Delay(2000).Wait();
seconds += 2;
request = BackgroundTaskHelper.BackgroundPlaylistTrigger.RequestAsync().GetResults();
if (request == Windows.ApplicationModel.Background.ApplicationTriggerResult.Allowed)
{
return GetBackgroundTaskReturnValue(apiRequestUrl).Result;
}
}
}
if (SettingsHelper.tempFolder.TryGetItemAsync(SettingsHelper.BackgroundPlaylistPlaybackReturnKey).GetResults() is StorageFile _file)
{
await _file.DeleteAsync();
}
SettingsHelper.localSettings.Values.Remove(SettingsHelper.BackgroundPlaylistPlaybackTokenKey);
SettingsHelper.localSettings.Values.Remove(SettingsHelper.BackgroundPlaylistPlaybackURLKey);
StaticItemsHelper.IsBackgroundPlaylistTaskRunning = false;
return "{ \"error\": {\"code\": \"NetworkError\", \"message\": \"Server returned nothing.\"} }";
}
實際解決方案: 但是它也沒有按我預(yù)期的那樣工作,所以我決定放棄它并使用以下代碼代替。(將此與問題進行比較)
public static async Task<string> GetResponseDataFromAPI(string apiRequestUrl, CancellationTokenSource cts = default)
{
cts = cts ?? new CancellationTokenSource(TimeSpan.FromSeconds(20));
try
{
if (StaticItemsHelper.IsAppInBackground)
{
//return await ViewHelper.GetBackgroundTaskReturnValue(apiRequestUrl);
var responseData = AuthRequestHelper.globalHttpClient.GetAsync(apiRequestUrl, cts.Token).Result;
var result = responseData.Content.ReadAsStringAsync().Result;
return result;
}
else
{
var responseData = await AuthRequestHelper.globalHttpClient.GetAsync(apiRequestUrl, cts.Token);
var result = await responseData.Content.ReadAsStringAsync();
return result;
}
}
catch (Exception ex)
{
INotifyHelper.iNotifyObject.IsDataLoading = false;
// show error
return "{ \"error\": {\"code\": " + $"\"{ex.HResult}\", \"message\": \"{ex.Message}\"" + "} }";
}
}
希望這對其他人有所幫助。
- 2 回答
- 0 關(guān)注
- 252 瀏覽
添加回答
舉報