使用 async/await 锁定资源

2024-04-12

我有一个应用程序,其中有一个可由多个客户端访问的共享资源(运动系统)。我有一些单独的操作,需要在移动期间访问系统,并且如果同时请求冲突的操作,则应抛出“繁忙”异常。我还有序列器,它们需要获得对运动系统的独占访问权限,以执行多个操作,并穿插其他操作;在整个序列期间,任何其他客户端都不应能够运行操作。

我传统上使用线程亲和性来解决这个问题,以便线程可以请求独占访问并运行与操作相对应的阻塞调用。当线程具有访问权限时,其他线程不能使用该资源。我现在遇到的问题是,我已经转向使用异步/等待模式来实现我的系统,以允许更清晰的排序器实现。问题是现在我的定序器并不总是在同一个线程上运行;活动线程可以在回调过程中发生变化,因此不再容易确定我是否处于有效的上下文中以继续运行操作。值得注意的一点是,某些操作本身是由等待组成的,这意味着序列和单个操作都可以跨越多个线程。

我的问题:有人知道在由于异步/等待而发生线程切换的情况下处理获取独占访问的好模式吗?

作为参考,我考虑了一些事情:

  1. 我可以创建一个自定义 SynchronizationContext,它将序列持续时间内的所有定序器调用封送到单个线程。这样做的好处是允许我重用现有的线程亲和性访问管理代码。缺点是,每当我执行序列或操作时,这都需要专用一个线程(因为操作也可以跨越多个线程。)

  2. 创建可获取的访问令牌以传递给操作方法以证明您已获取访问权限。这样做的缺点是使用令牌参数会使方法变得臃肿。

  3. 使用 (2) 中的访问令牌方法,但为操作接口创建重复的接口实现,以便可以使用“内置”令牌来实例化包装器。这会创建一些丑陋的粘合代码,但它清理了定序器代码,以便不再需要向每个方法传递令牌。


我的问题:有人知道在由于异步/等待而发生线程切换的情况下处理获取独占访问的好模式吗?

是的,您可以使用AsyncLock http://blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988.aspx,这也可以作为我的一部分AsyncEx 库 https://github.com/StephenCleary/AsyncEx。如果您想要进行“TryLock”类型的操作,那么您可能必须创建自己的原语。

您确实失去了一些进行安全检查的能力:无法检查当前正在执行的线程是否具有特定的AsyncLock.

其他选项包括ConcurrentExclusiveSchedulerPair(我在博客上提到过here http://nitoprograms.blogspot.com/2012/08/async-and-scheduled-concurrency.html)或 TPL 数据流。

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

使用 async/await 锁定资源 的相关文章

随机推荐

  • 获取 JSON 中未知值后面的字符串

    我使用维基百科的 API 来获取有关页面的信息 API 给了我这样的 JSON query pages 188791 pageid 188791 ns 0 title Vanit u00e9 langlinks lang bg Vanita
  • React Native expo 图像选择器将图像上传到 firebase 存储(v9)崩溃

    我正在尝试将从 expo 图像选择器中选择的图像上传到 firebase 存储 因为我正在使用 expo 我检查了 expo 图像选择器 git 并找到了 firebase 的 uploadImageAsync 所以我复制了它并只做了一点更
  • Jquery 对话框仅打开一次

    全部 我知道有人问过这个问题 但以前的解决方案似乎不适用于我的情况 我有一个简单的表 每行都有许多记录 最后一列是删除超链接 我正在尝试使用对话框弹出并确认删除 如果我使用对话框所在的 div 的显式名称 我将其恰好放置在表格所在的 div
  • Google 通讯录广播/推送/通知/Hook API

    我正在寻找一种在编辑 删除或创建谷歌方面的联系人时接收来自谷歌的通知 广播的方法 我查看了 Google Contacts API 文档 但找不到任何内容 我认为一定有办法 例如Android 肯定不会轮询更改 Google Contact
  • 文本底部的几个像素被切断

    我实在搞不懂这个案子到底是怎么回事 在多行文本上 底部的几个像素被切除 Setting line height normal 为我工作
  • JavaScript - 如何等待/SetTimeOut/睡眠/延迟

    这又是我的剪刀石头布游戏 目前 用户无法看到发生了什么 因为在提示输入 石头 布或剪刀 后 他们会立即重新提示 问题是我怎样才能使程序延迟 以便他们至少可以读取正在发生的事情 我读到 JavaScript 中不存在 sleep 我正在尝试使
  • Laravel bigInteger 在关系中四舍五入为 int

    好吧 这是我的迁移 public function up Schema create instagrams function Blueprint table table gt bigInteger id gt unsigned gt pri
  • sql server 中 System.Version 的数据类型

    最好的储存方式是什么系统版本 http msdn microsoft com en us library system version aspx在 SQL Server 中 当我使用varchar类型时 按asc排序的结果是 1 0 0 0
  • 找不到方法 getAndroidDeviceInfo 的实现

    我正在尝试运行这个example https github com flutter plugins tree master packages device info example在插件页面中 我收到这个错误 I flutter 3273
  • 如何在重定向到我的应用程序后关闭 Android 浏览器?

    重定向到我的应用程序后如何关闭浏览器 有什么办法可以做到这一点吗 据我所知 不可能影响其他活动 例如关闭等
  • 删除列表中复杂度优于 O(n^2) 的子字符串

    我有一个包含许多单词 100 000 的列表 我想做的是删除列表中每个单词的所有子字符串 因此 为了简单起见 我们假设我有以下列表 words Hello Hell Apple Banana Ban Peter P e 以下输出是所需的 H
  • 同时获取logcat和内核日志

    我正在尝试通过以下命令获取日志 logcat 和 kmsg logcat v 时间 f dev kmsg cat proc 但是我不确定日志文件存储在哪里以及它的名称是什么 我如何识别它 好的 这是谷歌快速搜索的结果 安卓日志系统 http
  • Haskell 中的 undefined 和 Java 中的 null 有什么区别?

    两者的类型都是所有类型的交集 无人居住 两者都可以在代码中传递而不会失败 直到尝试评估它们为止 我能看到的唯一区别是 在 Java 中 有一个漏洞允许null仅针对一个操作进行评估 即引用相等比较 而在 Haskell 中undefined
  • 设置特定文件的 AWS S3 过期时间

    我阅读了 PHP AWS SDK 文档 https docs aws amazon com aws sdk php v2 api class Aws S3 S3Client html https docs aws amazon com aw
  • 二分布局Gephi 0.9.1

    我的问题简单得令人尴尬 how do i plot a bipartite graph in Gephi with a layout like the one you see in the attached image 我真的无法在Geph
  • 是否可以通过显式类型转换将基类对象分配给派生类引用?

    是否可以在 C 中使用显式类型转换将基类对象分配给派生类引用 我已经尝试过了 它会产生运行时错误 不可以 对派生类的引用实际上必须引用派生类的实例 或 null 否则你会期望它如何表现 例如 object o new object stri
  • Jetty 返回 403 Forbidden

    您好 我正在将我的网络应用程序从 tomcat 移植到 Jetty 我正在使用 Jetty runner 来启动它 我使用以下命令来启动 Jetty java jar jetty runner jar port path url path
  • psql 显示 ansi 彩色文本

    My psqlrc有以下选项 setenv LESS iMSx4 FXR setenv PAGER less pset pager always 我想要着色的 psql 输出是 x1B 35m x1B 0m x1B 35mr x1B 0m
  • 检测Python字符串是数字还是字母[重复]

    这个问题在这里已经有答案了 如何检测字符串中的数字或字母 我知道您使用 ASCII 代码 但是哪些函数利用了它们呢 检查字符串是否为非负的数字 整数 和字母 您可以使用str isdigit https docs python org 2
  • 使用 async/await 锁定资源

    我有一个应用程序 其中有一个可由多个客户端访问的共享资源 运动系统 我有一些单独的操作 需要在移动期间访问系统 并且如果同时请求冲突的操作 则应抛出 繁忙 异常 我还有序列器 它们需要获得对运动系统的独占访问权限 以执行多个操作 并穿插其他