c# - 在c#中的单独线程中处理队列
问题描述
我有一个具有缓冲区大小的队列列表的类。我想在单独的线程中按顺序处理这些队列。最好的方法是什么?
每个队列都有一个单独的缓冲区大小。
Class QueueCollection
{
List<Queue> valuecollection = new List<Queue>();
// logic to add queue
}
解决方案
这是一个非常笼统的问题,所以我们最多只能给出非常笼统的答案。
您使用了两端没有可见锁定的基本队列。这是不行的。基本集合不适合多线程。它们会抛出完全意想不到的异常,例如由于 Add 和 Growing 之间的竞争条件,列表会抛出“太小”。
你需要类似的东西ConcurrentQueue<T>
:
https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentqueue-1
然而,这Channel<T>
也是一种选择。这是针对此类场景的目的构建队列:
https://docs.microsoft.com/en-us/dotnet/api/system.threading.channels.channel-1
请注意,这些集合只能处理与添加和检索项目相关的竞争条件。您可能还需要处理更多的比赛条件。
推荐阅读
- arrays - 将嵌套 JSON 转换为数组
- python - can i raise exception from inside a function in the 'try:' block when client disconnects from the server?
- sql - 如何在不使用 GROUP BY 或 PARTITION BY 的情况下对 Oracle SQL 中的数据进行分组
- javascript - 如何修复此错误:NotReadableError:无法启动视频源
- c# - 如何在应用程序的设置中保存图像或文件流?UWP C#
- bash - 如何将格式化的虚拟数据添加到文件中 x 时间步(即,步骤 0 到 40000)?
- java - 会话时间到期后注销
- python - 在 ubuntu 上编译并在 SuSe 12 SP4 上运行的 Pyinstaller 子进程的奇怪行为
- python - 基数为 16/十六进制的阿姆斯特朗/自恋数
- apache-spark - Spark 何时从 Executors 驱逐广播数据帧?