Akavache 的 GetObject 在等待时挂起。知道这里出了什么问题吗?

2024-04-26

我有一个 Xamarin.Forms 应用程序,在我的 App 类中包含以下代码(是的,这只是演示该问题的示例):

    public App()
    {
        BlobCache.ApplicationName = "MyApp";
        BlobCache.EnsureInitialized();


        // The root page of your application
        MainPage = GetMainPage();
    }

    public object BlockingGetExternalUser()
    {
        return GetExternalUser().Result;
    }

    private async Task<object> GetExternalUser()
    {
        try
        {
            return await BlobCache.LocalMachine.GetObject<object>("user");
        }
        catch (KeyNotFoundException)
        {
            return null;
        }
    }

密钥“用户”不存在,因此我希望得到 KeyNotFoundException。但是我从未见过抛出此异常。相反,它只是“挂起”并且永远不会从等待 GetObject 调用中返回。

我在 Android 5.0 手机上运行这个程序。

任何想法如何解决这一问题?我是否在做一些根本性错误的事情?

更新:附注:可以尝试检查密钥是否确实存在于缓存中,然后再从缓存中检索它,而不是立即尝试 GetObject。但是,如果我没有记错的话,除了调用 GetObject 并捕获异常(如上面的示例所示)之外,没有其他方法可以进行检查。对于只想知道某项是否存在的场景来说,这似乎并不理想。也许在 Akavache 中使用“Exists()”方法会更好?或者也许我错过了什么?

Update2:更改示例以不在构造函数中使用异步方法。只是为了证明一点,这不是问题。

Update3:从构造函数中删除调用。当我从代码中的任何位置调用 BlockingGetExternalUser 时,等待仍将挂起。


你肯定陷入了僵局。引用同步等待异步操作,以及为什么Wait()会在这里冻结程序 https://stackoverflow.com/questions/14485115/synchronously-waiting-for-an-async-operation-and-why-does-wait-freeze-the-pro:

异步方法中的等待正在尝试返回 UI 线程。

由于 UI 线程正忙于等待整个任务完成,因此出现了死锁。

请注意,您的电话是.Result意味着一个Task.Wait()某处。

有两种解决方案:要么完全避免async方法,或者将您的代码包装到Task.Run像这样:

public object BlockingGetExternalUser()
{
    return Task.Run<object>(() => GetExternalUser().Result);
}

(我希望它正在编译,我没有在 VS 中验证:)

根据经验,我倾向于避免async这些天结合 SQLite 的方法。原因是大多数 SQLite 包装库使用Task.Run提供反模式async对其方法进行包装,而 SQLite 没有任何异步的内在符号。但请注意,将东西包裹进去是完全可以的Task.Run使它们异步,这只是库设计者的一种反模式,向用户建议方法是异步的,而实际上它们不是。您可以在这里阅读更多相关信息:Task.Run 作为反模式? https://stackoverflow.com/questions/28766042/task-run-as-an-anti-pattern

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Akavache 的 GetObject 在等待时挂起。知道这里出了什么问题吗? 的相关文章

随机推荐

  • ‘access’参数模式有什么用处?

    Ada 中有三种传递参数的 正常 模式 in out and in out 但还有第四种模式 access 有什么需要它们的吗 即 否则不可能实现的事情 现在 我确实知道 GNAT JVM Ada 编译器在导入的 库 规范中大量使用了它们
  • 角度样式未应用于组件(尽管使用了主机选择器)

    我的角度项目中的组件样式存在问题 我基本上无法让它工作 为了解释我的问题 我使用 Angular CLI CLI 6 0 8 Angular 6 1 0 创建了一个新项目 我立即创建了一个新的测试组件 在其中声明了以下内容 COMPONEN
  • 最喜欢的开源 Google App Engine 应用程序(Java 或 Python)[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 你能阻止 jQuery focusout 在失去焦点时触发吗?

    我有一个输入框 我想在它失去焦点时保存它的值 非常简单的事情 我可以通过 jQuery 来完成focusout event 然而问题是我不想解雇focusout当用户单击输入框旁边的 X 图标时发生的事件 示例如下所示 因此 当用户跳出此输
  • 在 tomcat 上部署 AngularJS 应用

    我使用 yeoman 角度生成器创建了一个 AngularJS 应用程序 现在我想使用 Apache tomcat 托管它 我已经运行了 grunt build 并将所有资产准备在 dist 文件夹中 有没有办法创建 war 文件 或者我可
  • react-native limit 列表项

    我在用Flatlist https facebook github io react native docs flatlist html来自反应本机和ListItem https react native training github i
  • 在 Mobile Safari 中禁用同源策略

    我有一个 HTML5 JavaScript 应用程序 最初是为在某些汽车上运行而编写的 基本上 我需要将我的应用程序设置为在浏览器中运行 以便向客户进行简单的演示 我正在使用 jQuery ajax 它由于同源策略而导致问题 我发现了很多在
  • 有没有办法以特定顺序存储 PyTable 列?

    当使用字典或类进行模式定义以调用 createTable 时 PyTable 列似乎按字母顺序排列 我的需要是建立一个特定的顺序 然后使用 numpy genfromtxt 从文本中读取和存储我的数据 我的文本文件没有像 PyTable 那
  • IBM Worklight Server 6.2 - 在 Apache Tomcat 上运行? “等待管理服务启动超时”

    我一直在尝试设置 IBM Worklight 环境 我想使用 Windows服务器 Apache Tomcat 7 撰写本文时最新 IBM Worklight 6 2 撰写本文时最新版本 MySQL Server 5 6 撰写本文时最新 一
  • TypeScript 函数声明在接口中的区别

    TypeScript 接口中这两种函数声明有什么区别 interface IExample myFunction str string void and interface IExample myFunction str string gt
  • 如何在 Gremlin 中进行分页

    Tinkerpop 3中如何进行分页 我想获取查询的前 10 个元素 然后获取接下来的 10 个元素 而不必将它们全部加载到内存中 例如 下面的查询返回 1000 000 条记录 我想以 10 x 10 的形式获取它们 而不是一次加载所有
  • 如何在 Kivy 中设置小部件/布局的最小允许宽度/高度?

    我有包含 3 个元素的 BoxLayout 我需要第一个和最后一个元素占据最小的可用空间 中间元素具有固定比例 1 1 因此当我调整窗口大小时 侧面元素变得太小并且内容会超出其中 我需要例如标签 或按钮 甚至不同元素的集合 文本始终insi
  • 防止 iOS 在进入后台之前截取应用程序的屏幕截图

    大家可能都知道 iOS 在将应用程序放入后台之前会对其进行屏幕截图 这通常是为了更好的用户体验 例如快速动画以恢复应用程序等 我不希望我的应用程序屏幕截图存储在设备上 但我希望多任务处理仍然存在 我想出了一个解决方案 但我不确定我是否朝着正
  • Docker LABEL 用于在多阶段构建中访问构建镜像

    在 CI 构建期间 我通过添加以下内容从多阶段 Docker 构建 测试报告 中的构建映像中提取构建工件 LABEL构建步骤 然后使用带标签的图像创建一个容器以提取工件 这似乎在 Mac 版 Docker Desktop 中被破坏了 或者我
  • Android 上的 SQLite 如何处理长字符串?

    我想知道 Android 的 SQLite 实现如何处理长字符串 从 sqlite 的在线文档中读取 它说 sqlite 中的字符串限制为 100 万个字符 我的弦肯定更小 我正在创建一个简单的 RSS 应用程序 在解析 html 文档并提
  • Python 中的静态变量继承

    我正在为 Blender 的一个项目编写 Python 脚本 但我对该语言还很陌生 我感到困惑的是静态变量的使用 这是我目前正在处理的代码片段 class panelToggle bpy types Operator active Fals
  • 使用二进制遮罩遮罩 RGB 图像

    我在 MATLAB 中读入了一个 RGB 图像 M x N x 3 矩阵 我还有一个图像的二进制掩码 M x N 矩阵 对于某些感兴趣的区域来说它只是 0 而其他地方都是 1 我正在尝试找出如何使用该二进制掩码来掩蔽 RGB 图像 我尝试过
  • Android 将位图保存到 SD 卡

    我有一个按钮 我希望当我单击它时 图像会保存到 SD 卡中 或内部存储 如 htc one x 我们没有像 SD 卡这样的外部存储 这是我的代码 sd setOnClickListener new View OnClickListener
  • 我可以为我的 r 闪亮界面使用 index.html 和 ui.r 吗?

    在参照this http shiny rstudio com articles html ui html关于如何完全用 HTML 构建闪亮的应用程序 我想知道是否有任何方法可以将这种方法与传统的 ui r 方法结合使用 Reason Thi
  • Akavache 的 GetObject 在等待时挂起。知道这里出了什么问题吗?

    我有一个 Xamarin Forms 应用程序 在我的 App 类中包含以下代码 是的 这只是演示该问题的示例 public App BlobCache ApplicationName MyApp BlobCache EnsureIniti