C# 使文件选择器异步-Windows Phone 8.1

C# 使文件选择器异步-Windows Phone 8.1,c#,windows-runtime,windows-phone-8.1,C#,Windows Runtime,Windows Phone 8.1,我尝试使用taskcompletionsource使文件打开选择器异步,但有时我会使用-1返回值关闭应用程序,有时会出现异常,如: [System.Runtime.InteropServices.COMException] = {System.Runtime.InteropServices.COMException (0x80004005): Unspecified error Unspecified error at Windows.Storage.Pickers.FileOpenP

我尝试使用
taskcompletionsource
使文件打开选择器异步,但有时我会使用-1返回值关闭应用程序,有时会出现异常,如:

[System.Runtime.InteropServices.COMException] = {System.Runtime.InteropServices.COMException (0x80004005): Unspecified error

Unspecified error

   at Windows.Storage.Pickers.FileOpenPicker.PickSingleFileAndContinue()
   at PhotosGraphos.Mobile.Common.StorageFileExtensions.<PickSingleFileAsyncMobile..
[System.Runtime.InteropServices.COMException]={System.Runtime.InteropServices.COMException(0x80004005):未指定的错误
未指定的错误
在Windows.Storage.Pickers.FileOpenPicker.PickSingleFileAndContinue()中
在photographos.Mobile.Common.StorageFileExtensions.不要这样做(不要尝试将延续行为转换为异步)。为什么

通常情况下,当你的应用程序被放到后台时(例如,当你调用文件选择器时),它会被挂起,这里有一个小陷阱-当你连接了调试器时,你的应用程序将在不挂起的情况下工作。这肯定会引起一些麻烦

另外请注意,当您正常运行应用程序并启动选择器时,在某些情况下,您的应用程序可能会被终止(资源不足,用户将其关闭…)。因此,您需要VS在此处添加两件东西作为模板:ContinuationManager和SuspensionManager。更多内容请访问。在同一链接中,您将找到调试应用程序的好程序:

按照以下步骤测试在调用AndContinue方法后应用程序终止的情况。这些步骤确保调试器在完成操作并继续后重新连接到应用程序

  • 在VisualStudio中,右键单击项目并选择“属性”

  • 在项目设计器中,在“开始操作”下的“调试”选项卡上,启用“不启动,但在代码启动时调试”

  • 通过调试运行应用程序。这将部署应用程序,但不会运行它

  • 手动启动应用程序。调试器将连接到应用程序。如果代码中有断点,调试器将在断点处停止。当应用程序调用AndContinue方法时,调试器将继续运行

  • 如果你的应用程序调用了文件选择器,请等到你打开了文件提供商(例如电话、照片或OneDrive)。如果你的应用程序调用了在线身份提供商,请等到身份验证页面打开

  • 在“调试位置”工具栏上的“进程”下拉列表中,选择应用程序的进程。在“生命周期事件”下拉列表中,选择“挂起并关闭”以终止应用程序,但保持仿真器运行

  • AndContinue操作完成后,当应用程序继续运行时,调试器会自动重新连接到应用程序

  • 不要这样做(不要尝试将继续行为转换为异步)。为什么

    通常情况下,当你的应用程序被放到后台时(例如,当你调用文件选择器时),它会被挂起,这里有一个小陷阱-当你连接了调试器时,你的应用程序将在不挂起的情况下工作。这肯定会引起一些麻烦

    另外请注意,当您正常运行应用程序并启动选择器时,在某些情况下,您的应用程序可能会被终止(资源不足,用户将其关闭…)。因此,您需要VS在此处添加两件东西作为模板:ContinuationManager和SuspensionManager。更多内容请访问。在同一链接中,您将找到调试应用程序的好程序:

    按照以下步骤测试在调用AndContinue方法后应用程序终止的情况。这些步骤确保调试器在完成操作并继续后重新连接到应用程序

  • 在VisualStudio中,右键单击项目并选择“属性”

  • 在项目设计器中,在“开始操作”下的“调试”选项卡上,启用“不启动,但在代码启动时调试”

  • 通过调试运行应用程序。这将部署应用程序,但不会运行它

  • 手动启动应用程序。调试器将连接到应用程序。如果代码中有断点,调试器将在断点处停止。当应用程序调用AndContinue方法时,调试器将继续运行

  • 如果你的应用程序调用了文件选择器,请等到你打开了文件提供商(例如电话、照片或OneDrive)。如果你的应用程序调用了在线身份提供商,请等到身份验证页面打开

  • 在“调试位置”工具栏上的“进程”下拉列表中,选择应用程序的进程。在“生命周期事件”下拉列表中,选择“挂起并关闭”以终止应用程序,但保持仿真器运行

  • AndContinue操作完成后,当应用程序继续运行时,调试器会自动重新连接到应用程序


  • 我已将文件选择器更改为@Romasz提供的标准方式-它仍在崩溃。我已调试了数小时,得到了相同的
    COMException
    ,但有时会提供以下信息:

    "GetNavigationState doesn't support serialization of a parameter type which was passed to Frame.Navigate"
    
    似乎带有
    TaskCompletionSource
    的代码可以工作,这没有什么问题。我在
    Frame
    的msdn文档中发现了这一点

    注意:这些方法使用的序列化格式仅供内部使用。您的应用程序不应与之形成任何依赖关系。此外,此格式仅支持基本类型(如字符串、字符、数字和GUID类型)的序列化。

    我在导航参数中传递了我的模型类对象-因此它被保存在导航堆栈中,因此无法序列化。教训是:不要对导航参数-Frame使用非基本类型。导航应该不允许这样的导航并引发异常-但它没有

    编辑:
    另一个错误-如果你绑定点击(比如说按钮点击)或者类似这样的事件,以命令启动
    FileOpenPicker
    您需要检查
    picker.PickFile..
    之前是否被调用-否则,当您快速点击该按钮时,您将收到对
    picker.PickFile..
    的一些调用,并且将引发
    未经授权的访问异常

    我已将文件选择器更改为标准方式由@R提供
    "GetNavigationState doesn't support serialization of a parameter type which was passed to Frame.Navigate"