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);
                }
            }
        }
Esempio n. 2
0
        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);
                }
            }
        }