您的问题的解决方案是使用无锁算法,允许至少一个任务的系统范围进展。您需要使用依赖于CPU的内联汇编程序来确保您使用原子CAS(比较和交换)。维基百科有一个 文章 以及描述的模式 书 Douglas Schmidt称之为“面向模式的软件架构,并发和网络对象的模式”。我不清楚你将如何在dotnet框架下做到这一点。
解决问题的其他方法是使用发布订阅者模式或可能的线程池。
希望这有用吗?
有 C#5 CTP ,对使用new声明的方法执行连续传递样式转换 async 关键字和使用时的基于继续传递的调用 await 关键词。
async
await
这实际上不是新的CLR功能,而是一组指令,用于编译器对代码执行CPS转换,以及一些用于操作和调度延续的库例程。激活记录 async 方法放在堆而不是堆栈上,因此它们不依赖于特定的线程。
实际上,我们决定采用这个方向。我们正在使用带有Message Passsing的Observer模式。我们构建了一个本地库,用于处理类似于Erlang进程的“代理”之间的所有通信。稍后我们将考虑使用AppDomains来更好地将代理彼此分开。设计思想借鉴了Erlang编程语言,该语言具有极其可靠的多核和分布式处理。
由于压力下的问题,从CLR的v2中删除了光纤模式,请参阅:
据我所知,纤维支持尚未重新添加,尽管从阅读上述文章开始 的 可以 强> 再加上(但事实上,在这个主题上没有提到6到7年的事情让我相信它不太可能)。
FYI光纤支持旨在成为使用光纤(如SQL Server)以允许它们最大化性能的方式承载CLR的现有应用程序的一种方式, 的 不 强> 作为一种允许.Net应用程序创建线程的方法 - 的 短纤维不是解决问题的灵丹妙药 强> 但是,如果您有一个使用光纤的应用程序希望托管CLR,那么托管主机API确实为CLR提供了与您的应用程序“良好协作”的方法。关于此的一个很好的信息来源是 托管主机API文档 或者研究SQL Server如何托管CLR,其中有几篇内容丰富的文章。
还快速阅读 线程,光纤,堆栈和地址空间 。
不,不去上班。 C#(甚至IL)是一种过于复杂的语言,无法以一般方式执行此类转换(CPS)。你能得到的最好的就是C#5将提供的。也就是说,您可能无法通过更高阶循环/迭代来中断/恢复,这实际上是您希望从通用可再生延续中获得。