使用多个窗口/视图挂起UWP应用程序时保存数据:UI线程无响应

时间:2017-12-08 11:07:15

标签: c# windows uwp windows-10-universal

我有一个基本的UWP应用程序。该应用程序允许用户一次打开多个文档,每个文档都在一个单独的窗口中(即"查看")。

当应用暂停时,我请求ExtendedExecutionSession保存所有文档的更改。

但是,当我尝试在辅助窗口的相应UI线程上运行辅助窗口的保存操作时,代码永远不会运行。

我怀疑这是因为辅助窗口的UI线程已被冻结"应用程序一进入suspending状态。代码在应用程序恢复后立即运行。

我的问题:

  1. 在暂停(例如访问文件系统)多个窗口的UWP应用程序时保存更改的正确方法是什么?
  2. 如何尽可能快地保存每个文档的更改,以避免我的应用程序被系统终止(即我的应用程序被暂停时是否允许生成新线程)?
  3. 相关代码,App.xaml.cs:

        private async void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var l = logger.Entered("Suspending app");
    
            suspendDeferral = e.SuspendingOperation.GetDeferral();
    
            using (var session = new ExtendedExecutionSession())
            {
                session.Reason = ExtendedExecutionReason.SavingData;
                session.Description = "Saving Documents";
                session.Revoked += ExtendedExecutionSessionRevoked;
    
                var result = await session.RequestExtensionAsync();
    
                foreach (var controller in WindowController.WindowController.sharedInstance.getWindowLifetimeControls())
                {
                    var l2 = logger.Entered("Window controller: " + controller);
    
                    await controller.dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
                        // XXX never called for secondary window:
                        l2.Checkpoint("running async...");
                    });
    
                    l2.Exited();
                // […]
    

    注意:上面的dispatcherWindow.CoreWindow.Dispatcher。我保留所有打开窗口的引用。

    修改

    我尝试重新编写代码以便在挂起时保存同步,但即使这样的代码也会无限期挂起:

      tempZipFile.DeleteAsync().AsTask().GetAwaiter().GetResult();
    

0 个答案:

没有答案