通过 C++ 互操作或其他方式实现 C# 第一类延续?

2024-03-07

我们有一个非常高性能的多任务、近乎实时的 C# 应用程序。这一性能主要是通过使用自制的调度程序在内部实施协作多任务来实现的。这通常称为微线程。在这个系统中,所有任务都通过队列与其他任务通信。

我们遇到的具体问题似乎只能通过 C# 不支持的第一类延续来解决。

具体来说,该问题出现在处理队列的两种情况下。每当任何特定任务在将项目放入队列之前执行某些工作时。如果队列满了怎么办?

相反,不同的任务可能会完成一些工作,然后需要从队列中取出一个项目。如果该队列为空怎么办?

我们通过将队列链接到任务来解决 90% 的情况,以避免在任何出站队列已满或入站队列为空时调用任务。

此外,某些任务被转换为状态机,因此它们可以处理队列是否已满/空并继续执行而无需等待。

真正的问题出现在一些边缘情况下,在这些情况下执行任何一种解决方案都是不切实际的。该场景的想法是保存此时的堆栈状态并切换到不同的任务,以便它可以完成工作,然后在能够继续时重试等待任务。

过去,我们尝试将等待任务回调到调度中(递归地),以允许其他任务稍后重试等待任务。然而,这导致了太多“僵局”的情况。

有一个自定义 CLR 主机的示例,使 .NET 线程实际上作为“纤程”运行,这本质上允许在线程之间切换堆栈状态。但现在我似乎找不到任何示例代码。另外,似乎需要一些相当大的复杂性才能做到正确。

有没有人有任何其他创意想法如何有效地在任务之间切换并避免上述问题?

是否有任何其他 CLR 主机提供此功能(商业或其他方式)?是否有任何附加本机库可以为 C# 提供某种形式的延续?


有的是,它对用 new 声明的方法执行连续传递式转换async关键字,以及使用时基于连续传递的调用await关键词。

这实际上并不是一个新的 CLR 功能,而是编译器对代码执行 CPS 转换的一组指令以及一些用于操作和调度延续的库例程。激活记录async方法放置在堆上而不是堆栈上,因此它们不依赖于特定线程。

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

通过 C++ 互操作或其他方式实现 C# 第一类延续? 的相关文章

随机推荐

  • 错误 0x80005000 和 DirectoryServices

    我正在尝试使用 Net 中的目录服务运行简单的 LDAP 查询 DirectoryEntry directoryEntry new DirectoryEntry LDAP someserver contoso com DC contoso
  • 为什么 Xcode 7 显示 *.tbd 而不是 *.dylib?

    Xcode 7 在目标 gt 构建阶段 gt 链接二进制文件与库 gt 点击 按钮 选择要添加的框架时 您找不到 dylib 而是看到 tbd 这是什么原因呢 需要dylib的人 从这里开始post https stackoverflow
  • Python 将 3d 数组重塑为 2d

    我想将 numpy 数组重塑为所描绘的形状 从 3D 变为 2D 不幸的是 顺序不正确 假设有一个 numpy 数组 1024 64 100 并希望将其转换为 1024 100 64 有人知道如何维持秩序吗 我有一个样本数据 data 0
  • Maven - 对等点未经过身份验证

    几天前 我的专家停止工作了 更具体地说 它会停止下载依赖项 下面我记录了我为找到解决方案而执行的一系列信息和步骤 我仔细检查了 settings xml 这个文件也被我的同事使用 他们没有任何问题 我安装了 Maven 3 0 4 3 0
  • 存储批处理作业的密码

    我有一个小的java prog 它使用需要授权的网络服务 因此java prog 将使用Windows任务调度程序运行 需要有一个用户 密码参数 如何将它们存储在某个地方而不将它们作为纯文本放在文件中 到目前为止 我已经尝试使用runtim
  • 无法在将新附加的字符串列保存到 numpy 数组时执行 np.savetxt

    我有 numpy 数组mfcc具有 mfcc 值 且形状为 5911 20 我有一份清单a 其中有 5911 个标签 例如apple cow dog 我想将这些标签附加到mfccnumpy 数组 STEP1我将带有标签的列表转换为数组 at
  • 自定义 Django 字段来存储电子邮件地址列表

    我正在尝试向 Django 模型添加一个字段来表示电子邮件地址列表 我希望用户在管理中的表单中输入逗号分隔的地址列表 然后我的应用程序将解析该列表以发送一系列电子邮件 我当前的实现涵盖了基本思想 但有很大的局限性 在管理中 如果我输入类似的
  • 增加 JMeter 执行期间的线程数

    我有一个性能测试JMeter并想用它来测试最大系统性能 吞吐量 因此 当错误率低于 2 时 应增加活动线程数 我发现Constant Throughput Timer 把它放入Thread Group但它只会暂停或减慢线程 我尝试将其定义如
  • 从 Postman 向 Microsoft Bot 发送消息

    我正在尝试向我创建并发布到 azure 服务的机器人发送消息 以便该机器人可以开始向其某些用户发送消息 我尝试首先在 Postman 上发出请求 然后我可以为该交互构建一个控制器 我正在执行以下请求 POST https login mic
  • 单击手风琴中元素 id 的链接时打开 JQuery 手风琴

    这是我的问题http jsfiddle net uJ3W5 12 http jsfiddle net uJ3W5 12 正如您所看到的 顶部的 4 个按钮链接到手风琴第 1 部分中的元素 然而 当手风琴关闭时 这些链接不起作用 我需要它 这
  • 如何比较yaml文件中的键?

    有两个 Ruby on Rails 国际化 yaml 文件 一份文件完整 另一份文件缺少密钥 如何比较两个 yaml 文件并查看第二个文件中缺少的键 有没有工具可以做到这一点 假设file1是正确的版本并且file2是缺少密钥的版本 def
  • 将 VS2019 与 TFS2018 vnext 构建系统结合使用,无需服务器端解决方法

    我最近在尝试将 VS2019 与 TFS2018 vnext 构建系统一起使用时遇到了问题 在 Visual Studio Build 步骤中不能选择VS2019 选择 Latest 则不会使用Visual Studio 2019 在测试服
  • 是否可以对 feed 进行过滤

    是否可以对流中的提要实施过滤 我希望允许用户关注其他用户帖子 但将这些帖子标记为各种类别 我们的愿望是选择一个 足球 类别 并仅查看我关注的人发布的具有该标签的帖子 或者如果该类别是 所有体育 则可能是一个标签集合 查看 api 和文档 提
  • Spring集成:如何顺序处理文件

    我使用 int file inbound channel adapter 来加载目录中存在的文件 我喜欢按顺序处理文件 这意味着当第一个文件的处理完成时 我加载第二个文件 等等 I see a sample https github com
  • Firefox 中的无效日期 - Javascript

    我想将以下字符串 10 10 2013 03 04 放入 Date 对象中 它在 Chrome 中工作 但 Firefox 告诉我这是一个无效的日期 我猜他们的意思是格式 我尝试对其使用 Date parse 但这使其成为 NaN 该怎么办
  • 如何向表达式添加另一个条件?

    我有这样的表情 Expression
  • Mongoose - 如何分组和填充?

    我使用 MongoDB 和 Mongoose 作为我的 ODM 我尝试使用以下命令进行查询populate and group by在同一份声明中 这是我的简单文档模型 var userSchema new Schema username
  • 避免在 WooCommerce 购物车中组合虚拟和物理产品

    我已经寻找这个问题很长时间了 但似乎从未找到可能的解决方案 有谁看到任何解决方案如何在一个 Woocommerce 购物车中仅允许物理或虚拟产品 当客户尝试添加虚拟和物理的组合并禁止该组合时 或者确保该组合不能出现在一个购物车中时 可能会弹
  • 当网络连接关闭时,适用于 Android 的 Picasso 库是否可以处理图像加载?

    我正在开发一个我使用的应用程序毕加索图书馆 http square github io picasso 用于在我的中加载图像ViewPager和别的ImageViews 所以我想知道如果网络连接关闭会发生什么 库是否可以自行处理 或者我是否
  • 通过 C++ 互操作或其他方式实现 C# 第一类延续?

    我们有一个非常高性能的多任务 近乎实时的 C 应用程序 这一性能主要是通过使用自制的调度程序在内部实施协作多任务来实现的 这通常称为微线程 在这个系统中 所有任务都通过队列与其他任务通信 我们遇到的具体问题似乎只能通过 C 不支持的第一类延