其他人对移动设备上的FolderPicker.PickSingleFolderAsync有问题吗



我认为FolderPicker.PickSingleFolderAsync在Windows 10移动设备上的实现中有一个错误:调用该函数似乎会导致某种错误,并停止正常的代码执行流。

然而,让人抓狂的是,只有当应用程序在没有附加调试器的情况下运行时,才会出现不正确的行为,这使得很难准确地了解发生了什么。

考虑以下代码:

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();
}

更新

我一直在进一步调查这个问题,我认为这是由于用户在与文件选择器交互时应用程序被暂停所致。

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

  1. 打开文件选择器
  2. 导航到一个位置:我在第一个选择器页面上点击设备或SD卡,选择器似乎不会取代前台应用程序
  3. 暂停应用程序:从"调试位置"工具栏单击暂停按钮
  4. 确认选取器中的选择

在许多情况下,这会导致后面的任何代码

await picker.PickSingleFolderAsync();

语句不执行。

不幸的是,在WindowsPhone8上,处理picker的方法意味着使用

picker.PickFolderAndContinue();

并且明确地处理应用程序挂起,在Windows 10上不再可能这样做:调用上面的方法会引发异常。

原来问题是调用

SuspendingOperation.GetDeferral();

OnSuspending事件中,当应用程序由于文件选取器接管而挂起时。

即使

SusendingDeferral.Complete();

之后立即呼叫(没有等待操作完成)。

确保在应用程序因文件选取器而暂停时不请求延期,足以使问题停止。

最新更新