其他任何人在手机上遇到FolderPicker.PickSingleFolderAsync问题?

时间:2017-02-02 13:58:37

标签: uwp windows-10 windows-mobile windows-10-universal

我相信在Windows 10移动版上的FolderPicker.PickSingleFolderAsync实现中存在一个错误:调用该函数似乎会导致某种错误并停止正常的代码执行流程。

然而,令人发狂的是,只有当应用程序在没有附加调试器的情况下运行时才会出现错误的行为,这使得确切地知道发生了什么事情很难说。

请考虑以下代码:

public async Task<bool> UserSelectFolderAsync()
{
    var picker = new FolderPicker();
    picker.SuggestedStartLocation = PickerLocationId.Desktop;
    picker.FileTypeFilter.Add(".");

    await ShowDialogAsync("Picking folder");
    var folder = await picker.PickSingleFolderAsync();
    await ShowDialogAsync("Picked folder");

    if (folder == null)
        return false;

    StorageApplicationPermissions.FutureAccessList.Clear();
    selectedFolder = folder;
    StorageApplicationPermissions.FutureAccessList.Add(selectedFolder);

    return true;
}

private async Task ShowDialogAsync(string message)
{
    MessageDialog showDialog = new MessageDialog(message);
    await showDialog.ShowAsync();
}

更新

我一直在进一步研究这个问题,我相信这是因为当用户与文件选择器进行交互时应用程序被暂停。

在移动设备上,调用选择器意味着打开一个不同的应用程序,文件资源管理器,并在前台设置它,具有应用程序生命周期方面的常见含义。我已经能够在模拟器上相当可靠地重现问题,并附带调试器:

  1. 打开文件选择器
  2. 导航到某个位置:onless我点击第一个选择器页面中的设备或SD卡,选择器似乎没有作为前台应用程序接管
  3. 暂停应用:从“调试位置”工具栏中单击暂停按钮
  4. 确认选择器中的选择
  5. 在许多情况下,这会导致

    之后的任何代码
    await picker.PickSingleFolderAsync();
    

    声明不执行。

    不幸的是,在Windows Phone 8上处理选择器的方法意味着使用

    picker.PickFolderAndContinue();
    

    并明确处理应用程序暂停,在Windows 10上不再可能这样做:调用上面的方法会抛出异常。

1 个答案:

答案 0 :(得分:0)

原来问题是调用

SuspendingOperation.GetDeferral();

OnSuspending事件中,当应用程序因文件选择器接管而被暂停时。

这即使

SusendingDeferral.Complete();
之后立即调用

(无需等待操作完成)。

当应用程序因文件选择器暂停而导致问题停止时,确保不会请求延期。