一种解决方案是共享一个并发队列,例如(尽管它的名字)ConcurrentQueue。这将允许您将一个对象从一个线程入队,并使另一个线程(或其他线程)从队列中出队。由于它是一个通用的解决方案,您可以传递强类型项,从stringtoAction可以做的任何事情,当然也可以传递您自己的自定义消息类。
这种方法只有一个限制,该类ConcurrentQueue仅从 .NET 4.0 开始可用。如果您需要在以前版本的 .NET 中使用它,您需要寻找第三方库。例如,您可以从 mono 获取 ConcurrentQueue的来源。
这些队列工作的一般方法是通过一个链表和它们使用自旋进行同步的乐观并发控制资源。据我所知,这是可变大小并发队列的最新技术。现在,如果您事先知道消息负载,您可以尝试固定大小的方法或有利于入队和出队而不是增长的解决方案(这将是基于数组的队列)。
完整披露(根据faq):我是这些第三方库之一的作者......我的库(nuget 可用),它包括ConcurrentQueue基于自定义实现的旧版本 .NET的向后移植。你可以在下面找到底层结构Theraot.Collections.ThreadSafe.SafeQueue,它是一个数组的链表(保存在一个对象池中),通过这种方式,我们不需要复制数组来增长(因为我们只是添加另一个节点到列表),并且我们不需要经常依赖同步机制(因为添加或删除项目不会经常修改列表)。
注意:这个问题曾经链接到托管在另一个存储库上的 HashBucket,并且是我对该问题的旧解决方案。该项目已停产,请使用我上面提到的版本。
这是一个老问题,但仍然是一个相关的话题......
生产者/消费者方法可以用作此类问题的可能解决方案。.NET Core 从 3.0 版本开始,有一个命名空间,其中包含可以以简单方式处理该问题的工具。
看一下System.Threading.Channels:
https://learn.microsoft.com/en-us/dotnet/api/system.threading.channels https://devblogs.microsoft.com/dotnet/an-introduction-to-system-threading-channels/
| 归档时间: |
|
| 查看次数: |
15581 次 |
| 最近记录: |