我相信在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();
}
更新
我一直在进一步研究这个问题,我相信这是因为当用户与文件选择器进行交互时应用程序被暂停。
在移动设备上,调用选择器意味着打开一个不同的应用程序,文件资源管理器,并在前台设置它,具有应用程序生命周期方面的常见含义。我已经能够在模拟器上相当可靠地重现问题,并附带调试器:
在许多情况下,这会导致
之后的任何代码await picker.PickSingleFolderAsync();
声明不执行。
不幸的是,在Windows Phone 8上处理选择器的方法意味着使用
picker.PickFolderAndContinue();
并明确处理应用程序暂停,在Windows 10上不再可能这样做:调用上面的方法会抛出异常。
答案 0 :(得分:0)
原来问题是调用
SuspendingOperation.GetDeferral();
在OnSuspending
事件中,当应用程序因文件选择器接管而被暂停时。
这即使
SusendingDeferral.Complete();
之后立即调用(无需等待操作完成)。
当应用程序因文件选择器暂停而导致问题停止时,确保不会请求延期。