通过 C++ 互操作或其他方式进行 C# 一流延续?

标签 c# .net queue multitasking continuations

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

我们遇到的特定问题似乎只能通过 C# 不支持的一流延续来解决。

具体来说,问题出现在 2 个处理队列的案例中。每当任何特定任务在将项目放入队列之前执行某些工作时。如果队列已满怎么办?

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

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

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

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

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

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

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

是否有任何其他 CLR 主机提供此服务,商业或其他方式?是否有任何附加的 native 库可以为 C# 提供某种形式的延续?

最佳答案

C# 5 CTP ,它对使用新的 async 关键字声明的方法执行延续传递式转换,并在使用 await 关键字时执行基于延续传递的调用。

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

关于通过 C++ 互操作或其他方式进行 C# 一流延续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8685806/

相关文章:

java - 迭代器和抛出异常

C# 对话框选择多个文件和文件夹

c# - 我是在做错什么还是无法并行提取 zip 文件?

.net - Silverlight 3 到 4 风险分析

.net - 为什么 Visual-Studio 开发服务器会自动分配端口号?

java - 如何检查消息发送到 JMS 队列是否成功?

c# - 将 Sharepoint App 2013 部署到 Windows Azure(提供商托管)

c# - OpenFileDialog C# 自定义筛选器,如 'ABC*.pdf'

c# - 实例化后如何找到 log4net 实例?

c++ - 具有线程 vector 和队列 C++ 的管道