例如,一种解决方案是共享并发队列(尽管它的名称)并发队列 http://msdn.microsoft.com/en-us/library/dd267265.aspx。这将允许您将一个对象从一个线程入队,并让另一个线程(或其他线程)从队列中出队。由于它是一个通用的解决方案,您可以传递强类型的项目,任何来自string
to Action
当然,或者您自己的自定义消息类也可以。
这种方法只有一个限制,即类ConcurrentQueue
仅从 .NET 4.0 开始可用。如果您需要针对以前版本的 .NET,您需要寻找第三方库。例如,您可以采取来自 mono 的 ConcurrentQueue 源 https://github.com/mono/mono/blob/master/mcs/class/referencesource/mscorlib/system/collections/Concurrent/ConcurrentQueue.cs.
这些队列工作的一般方法是使用链表,并使用旋转进行同步,将它们资源用于乐观并发控制。据我所知,这是可变大小并发队列的最新技术。现在,如果您事先知道消息负载,则可以尝试固定大小的方法或有利于入队和出队而不是增长的解决方案(这将是基于数组的队列)。
全面披露(根据faq https://stackoverflow.com/faq#promotion):我是这些第三方库之一的作者......我的图书馆 https://github.com/theraot/Theraot(nuget可用),它包括一个向后移植ConcurrentQueue
对于旧版本的.NET,基于自定义实现。您可以在下面找到底层结构Theraot.Collections.ThreadSafe.SafeQueue
,它是一个数组的链表(保存在对象池中),通过这样做,我们不需要复制数组来增长(因为我们只是向列表中添加另一个节点),并且我们不需要需要经常依赖同步机制(因为添加或删除项目不会经常修改列表)。
注意:这个问题曾经链接到 HashBucket,它托管在另一个存储库上,是我解决该问题的旧解决方案。该项目已停止,请使用我上面提到的版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)