async Task RunAsync(IBackgroundTaskInstance taskInstance) { BackgroundTaskDeferral deferral = null; BackgroundAudioRun run = null; MemoryDiagnostics.DumpMemory(); var usage = MemoryManager.AppMemoryUsage; var limit = MemoryManager.AppMemoryUsageLimit; if (usage + RequiredMemory > limit) { Debug.WriteLine("*** SmMediaBackgroundAudioTask.RunAsync() low memory"); // We can't play anything because there isn't enough memory. Force // the process to restart. try { Application.Current.Exit(); } catch (Exception ex) { Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() exit failed " + ex.ExtendedMessage()); } // Exit() didn't help, so we hog as much as we can of the remaining memory. MemoryHog.ConsumeAllMemory(); BackgroundMediaPlayer.Shutdown(); return; } var deferralId = Guid.NewGuid(); try { Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() getting deferral " + deferralId); deferral = taskInstance.GetDeferral(); try { #if DEBUG _memoryDiagnostics.StartPoll(); #endif run = new BackgroundAudioRun(taskInstance.InstanceId); var oldRun = Interlocked.Exchange(ref _run, run); if (null != oldRun) { Debug.WriteLine("SmMediaBackgroundAudioTask.Run() run already exists"); oldRun.Dispose(); } taskInstance.Canceled += run.OnCanceled; taskInstance.Task.Completed += run.OnTaskCompleted; await run.ExecuteAsync().ConfigureAwait(false); } catch (Exception ex) { Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() failed " + ex.ExtendedMessage()); } try { #if DEBUG _memoryDiagnostics.StopPoll(); #endif var currentRun = Interlocked.CompareExchange(ref _run, null, run); if (!ReferenceEquals(currentRun, run)) Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() mismatching run"); if (null != run) { taskInstance.Canceled -= run.OnCanceled; taskInstance.Task.Completed -= run.OnTaskCompleted; } if (null != run) run.Dispose(); } catch (Exception ex) { Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() cleanup failed: " + ex.ExtendedMessage()); } } finally { if (null != deferral) { deferral.Complete(); Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() released deferral " + deferralId); } } }
async Task RunAsync(IBackgroundTaskInstance taskInstance) { BackgroundTaskDeferral deferral = null; BackgroundAudioRun run = null; MemoryDiagnostics.DumpMemory(); var usage = MemoryManager.AppMemoryUsage; var limit = MemoryManager.AppMemoryUsageLimit; if (usage + RequiredMemory > limit) { Debug.WriteLine("*** SmMediaBackgroundAudioTask.RunAsync() low memory"); // We can't play anything because there isn't enough memory. Force // the process to restart. try { Application.Current.Exit(); } catch (Exception ex) { Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() exit failed " + ex.ExtendedMessage()); } // Exit() didn't help, so we hog as much as we can of the remaining memory. MemoryHog.ConsumeAllMemory(); BackgroundMediaPlayer.Shutdown(); return; } var deferralId = Guid.NewGuid(); try { Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() getting deferral " + deferralId); deferral = taskInstance.GetDeferral(); try { #if DEBUG _memoryDiagnostics.StartPoll(); #endif run = new BackgroundAudioRun(taskInstance.InstanceId); var oldRun = Interlocked.Exchange(ref _run, run); if (null != oldRun) { Debug.WriteLine("SmMediaBackgroundAudioTask.Run() run already exists"); oldRun.Dispose(); } taskInstance.Canceled += run.OnCanceled; taskInstance.Task.Completed += run.OnTaskCompleted; await run.ExecuteAsync().ConfigureAwait(false); } catch (Exception ex) { Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() failed " + ex.ExtendedMessage()); } try { #if DEBUG _memoryDiagnostics.StopPoll(); #endif var currentRun = Interlocked.CompareExchange(ref _run, null, run); if (!ReferenceEquals(currentRun, run)) { Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() mismatching run"); } if (null != run) { taskInstance.Canceled -= run.OnCanceled; taskInstance.Task.Completed -= run.OnTaskCompleted; } if (null != run) { run.Dispose(); } } catch (Exception ex) { Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() cleanup failed: " + ex.ExtendedMessage()); } } finally { if (null != deferral) { deferral.Complete(); Debug.WriteLine("SmMediaBackgroundAudioTask.RunAsync() released deferral " + deferralId); } } }