我有像下面這樣的代碼,使用每15分鐘運行的定時器上的後臺任務上傳數據。 當沒有什麼可以上傳我的日誌顯示UWP後臺任務取消
Windows同步成功:0米:0:813ms
然而,當真正有數據上傳這需要一點時間和我結束了2個數量級
Windows同步取消後:0米:25S:108ms - ExecutionTimeExceeded Windows同步成功:0米:-27:617ms
我明白我只有25秒的後臺任務 - 但是我的問題是爲什麼當觸發OnCancelled事件時,我的「finally」塊被執行?
這並不總是會發生,這讓我感到困惑。通常我只是得到取消的日誌。 finally塊總是會被調用嗎?
此外 - 作爲旁白 - 當我測試這個時,我的設備處於睡眠模式,當後臺任務被觸發 - 不知道這是否相關。
public sealed class BackgroundSync : IBackgroundTask
{
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
private DateTime startTime;
private DateTime endTime;
public async void Run(IBackgroundTaskInstance taskInstance)
{
BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
// Associate a cancellation handler with the background task.
taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCancelled);
try
{
await Task.Run(async() =>
{
startTime = DateTime.Now;
// MY PROCESSSING IN HERE
endTime = DateTime.Now;
});
}
catch (Exception e)
{
await DataNAVToMobile.InsertBackgroundLog("WINDOWS SYNC EXCEPTION: " + e.Message);
}
finally
{
TimeSpan timeSpan = endTime - startTime;
await DataNAVToMobile.InsertBackgroundLog("WINDOWS SYNC SUCCESS: " + String.Format("{0}m:{1}s:{2}ms",timeSpan.Minutes,timeSpan.Seconds,timeSpan.Milliseconds));
_deferral.Complete();
}
}
private void OnCancelled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
// The background task has been detected as idle or hung.
// Cancel all pending async operations and return from the task.
endTime = DateTime.Now;
TimeSpan timeSpan = endTime - startTime;
DataNAVToMobile.InsertBackgroundLog("WINDOWS SYNC CANCELLED AFTER: " + String.Format("{0}m:{1}s:{2}ms", timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds) + " - " + reason.ToString());
cancelTokenSource.Cancel();
}
謝謝 - 這對我迄今爲止測試過的所有東西都很有意義 – RCairns