/// <summary> /// Release the deferral for a type if it is held /// </summary> /// <param name="type"></param> private void ReleaseDeferral(UpdateTypes type) { lock (this) { if (type == UpdateTypes.LockScreen) { if (m_lockScreenRefDeferral != null) { m_lockScreenRefDeferral.ReleaseRef(); } m_lockScreenRefDeferral = null; } else if (type == UpdateTypes.Band) { if (m_bandRefDeferral != null) { m_bandRefDeferral.ReleaseRef(); } m_bandRefDeferral = null; } else { if (m_desktopRefDeferral != null) { m_desktopRefDeferral.ReleaseRef(); } m_desktopRefDeferral = null; } } }
/// <summary> /// Called by the app when the app is suspending /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void OnSuspending_Fired(object sender, SuspendingEventArgs e) { // Setup a ref deferral for everyone to hold. We also need to setup a clean up action to save the setting // when the deferral is done. RefCountedDeferral refDeferral = new RefCountedDeferral(e.SuspendingOperation.GetDeferral(), () => { // We need to flush the settings here just before we complete the deferal. We need to block this function // until the settings are flushed. using (AutoResetEvent are = new AutoResetEvent(false)) { Task.Run(async() => { // Flush out the local settings await SettingsMan.FlushLocalSettings(); are.Set(); }); are.WaitOne(); } }); // Add a ref to cover anyone down this call stack. refDeferral.AddRef(); // Make the OnSuspendingArgs args = new OnSuspendingArgs() { RefDeferral = refDeferral }; // Fire the event m_onSuspending.Raise(this, args); // Release our ref to the deferral refDeferral.ReleaseRef(); }
/// <summary> /// Release the deferral for a type if it is held /// </summary> /// <param name="type"></param> private void ReleaseDeferral(UpdateTypes type) { lock (this) { switch (type) { case UpdateTypes.LockScreen: _lockScreenRefDeferral?.ReleaseRef(); _lockScreenRefDeferral = null; break; case UpdateTypes.Band: _mBandRefDeferral?.ReleaseRef(); _mBandRefDeferral = null; break; case UpdateTypes.All: break; case UpdateTypes.Desktop: break; default: _mDesktopRefDeferral?.ReleaseRef(); _mDesktopRefDeferral = null; break; } } }
/// <summary> /// Releases the deferral if it is held. /// </summary> private void ReleaseDeferal() { if (m_refDeferral != null) { m_refDeferral.ReleaseRef(); } m_refDeferral = null; }
public async void Run(IBackgroundTaskInstance taskInstance) { // Create the baconit manager _mBaconMan = new BaconManager(true); // Setup the ref counted deferral var refDeferral = new RefCountedDeferral(taskInstance.GetDeferral(), OnDeferralCleanup); // Add a ref so everyone in this call is protected refDeferral.AddRef(); // Fire off the update await _mBaconMan.BackgroundMan.RunUpdate(refDeferral); // After this returns the deferral will call complete unless someone else took a ref on it. refDeferral.ReleaseRef(); }
/// <summary> /// Releases the deferral if it is held. /// </summary> private void ReleaseDeferral() { _refDeferral?.ReleaseRef(); _refDeferral = null; }