Task.WhenAny 和 SemaphoreSlim 类

2023-12-09

使用时WaitHandle.WaitAny and Semaphore class像下面这样:

var s1 = new Semaphore(1, 1);
var s2 = new Semaphore(1, 1);

var handles = new [] { s1, s2 };

var index = WaitHandle.WaitAny(handles);

handles[index].Release();

似乎可以保证只有一个信号量被获取WaitHandle.WaitAny.

是否可以为异步(async/await)代码获得类似的行为?


我想不出内置的解决方案。我会这样做:

var s1 = new SemaphoreSlim(1, 1);
var s2 = new SemaphoreSlim(1, 1);

var waits = new [] { s1.WaitAsync(), s2.WaitAsync() };

var firstWait = await Task.WhenAny(waits);

//The wait is still running - perform compensation.
if (firstWait == waits[0])
 waits[1].ContinueWith(_ => s2.Release());
if (firstWait == waits[1])
 waits[0].ContinueWith(_ => s1.Release());

这会获取两个信号量,但会立即释放第二个信号量。这应该是等价的。我无法想象不必要地获取信号量的负面后果(当然性能除外)。

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

Task.WhenAny 和 SemaphoreSlim 类 的相关文章

  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • gdb 在 docker 上立即退出“进程已完成,退出代码 1”或 lldb“数据包返回错误 8”。另外:如何在 docker 中允许进行 C++ 调试

    这花了我一整天的时间才找到 所以我将其发布以供将来参考 我正在 docker 镜像上开发 C 我正在使用克利翁 我的代码是在调试模式下编译的 并且在运行模式下运行良好 但是当尝试调试时 进程会立即退出 并显示非常丰富的信息 Process
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • 如何使用锚标记下载文件

    为什么这不起作用 下载 html a href jsplogin jar download a The jsplogin jar文件位于同一文件夹中download html file 当我单击下载链接时jsplogin jar应该下载 但
  • Google 电子钱包服务器是否会对每次订阅续订进行回调?

    我有一个使用订阅 API 的钱包集成 Web 产品 如 中所述文档 模拟了首次付款和取消 一切正常 Google 电子钱包服务器是否会在每次定期续订时调用服务器 显然客户端当时可能不在线 定期付款自动发生 无需回调至商家服务器 处理定期付款
  • 设置 UILabel 行距

    如何修改多行中的行间距 行距 UILabel Edit 显然NSAttributedString在 iOS 6 及更高版本上可以做到这一点 而不是使用NSString要设置标签的文本 请创建一个NSAttributedString 为其设置
  • 将自定义对象从 JList 拖放到 JLabel 中

    我有一个包含自定义对象 ArrayList 的 JList 并且我正在尝试创建拖放到字段中的操作 我无法理解如何打包和接收 Transferable 中的对象 据我所知 这大约是 import java awt import java aw
  • 计算 SQL Server 中不包括重叠时间和中断的总时间

    从选择查询的开始时间和结束时间列表中 我需要找出不包括重叠时间和休息时间的总时间 StartTime EndTime 2014 10 01 10 30 00 000 2014 10 01 12 00 00 000 90 mins 2014
  • 来自多个变量的 Pivot_wider 函数(tidyr r 包)

    我想将数据框置于宽格式中 考虑两个变量作为标准 甚至可能是不必要的 但我对此发表评论是因为原始 df 是 480 行和几个子级别 这是返回一个错误 library tidyr library dplyr df lt structure li
  • 如何在 JavaFX css 中将 -fx-max-width 设置为 USE_PREF_SIZE?

    我正在编写一个 JavaFX 8 应用程序 想知道是否可以将 例如 按钮的最小或最大宽度设置为USE PREF SIZE通过CSS 班上Region定义USE PREF SIZE as Double NEGATIVE INFINITY 但是
  • 如何迭代(键,值)boost::python:dict

    我怎样才能迭代C 在我的升压 python 字典 我需要key and value在每个循环中 我的尝试是这样的 for auto x MyBoostPythonDict iteritems determine key determine
  • SQLSTATE[HY093]:参数号无效[重复]

    这个问题在这里已经有答案了 我在执行搜索查询时遇到一些问题 我收到这个错误 SQLSTATE HY093 参数号无效 这是我的代码
  • 执行 R 脚本时 MS-SQL 服务器中的“无效 BXL 流”

    我正在将 R 脚本作为 ms sql 存储过程执行 我正在尝试使用 geosphere 包 但是当我执行存储过程时 出现错误 无效的 BXL 流 并且执行停止 该软件包已安装在计算机上 只需加载该软件包就会导致此错误 即library ge
  • 复制链表C中的节点

    我正在尝试复制链表中的节点 我不确定我是否做得正确 我尝试制作测试用例 但没有成功 如果有人可以告诉我哪里出了问题以及我做对了什么 以及测试我的代码的最佳方法是什么 struct node int id char side int quan
  • 如何检查 SymPy 表达式是否具有解析积分

    我想解决我的另一个问题here因此 每当 和 积分没有解析 符号解时 我需要 sympy 返回错误 例如 如果我尝试 from sympy import init printing use unicode False wrap line F
  • 如何从 Excel 的数据列中删除字符

    我正在格式化收到的一些数据 我在 A 列中有几百个学生的名字 由于某种奇怪的原因 有一个随机的 随机放置在名称中 我想以编程方式删除所有 所有名字中的字符 For x 2 To 300 Dim strStudent as String ho
  • 如何将外部自定义 URL 添加到 woocommerce 端点

    我想将自定义端点 URL 添加到 woocommerce 上的我的帐户页面 是否可以 因此 当客户点击此链接时 他们将重定向到我的 YouTube 页面 function custom wc end point if class exist
  • 将段落拆分成句子

    我有一大堆文字 例如 我想将一个段落分成句子 但有一个问题 我的段落包括诸如 Jan 13 2014 之类的日期 诸如 U A E 之类的单词以及诸如 2 2 之类的数字 我该如何分割这个 Output I want to split a
  • 排列矩阵的行和列

    假设我有以下矩阵 数组 array 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 0 我想应用以下排列 1 gt 5 2 gt 4 结果最终应该是 array 1 1 1 0 0 1 0 1
  • 如何确定文件、函数和行号?

    在 C 中 我可以像这样打印调试输出 printf FILE s FUNC s LINE d LOG s n FILE FUNCTION LINE logmessage 我怎样才能在Python中做类似的事情 有一个名为inspect它提供
  • CSS 悬停时更改颜色

    我试图用第二个来覆盖我的第一个 颜色变化 我希望在悬停文本时在图标上显示银色 在悬停图标时在图标上显示红色图标 I tried HTML ul li class liDoc a href My link a i class fa fa tr
  • 如何使用正则表达式 Java 将方括号内的破折号替换为下划线

    我试图用下划线替换方括号内的破折号 但它会用字符串中的下划线替换所有破折号 例如 我想替换 a a gamma with a a gamma 但它取代了all带有下划线的字符串中的破折号 您可以使用 String n a a gamma S
  • Task.WhenAny 和 SemaphoreSlim 类

    使用时WaitHandle WaitAny and Semaphore class像下面这样 var s1 new Semaphore 1 1 var s2 new Semaphore 1 1 var handles new s1 s2 v