问题标签 [concurrent-collections]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
286 浏览

c# - 一段时间后,套接字从队列中延迟

我试图Socket.Select在多线程应用程序中使用,我不想使用async socket,所以这是我的代码:-

问题是一段时间后,其中一个连接的套接字将被延迟,其中一个套接字将停止发送或接收,直到其他套接字之一这样做!或者它可能需要几秒/分钟才能恢复接收和发送!

我不知道为什么会发生这种情况!?也许我选择队列的方式?,我希望有人能指出我可能导致延迟发生的原因,谢谢。

0 投票
2 回答
476 浏览

c#-4.0 - 在任务 (TPL) 中使用通用字典

我有以下代码:

在这种情况下我应该使用 aConcurrentDictionary而不是 a吗?Dictionary即使我确保键不会在逻辑级别上重复?

0 投票
2 回答
1356 浏览

c# - 异步任务的许多实例可以共享对并发集合的引用并在 C# 中同时向其中添加项目吗?

我刚刚开始学习 C# 线程和并发集合,并且不确定提出问题的正确术语,所以我将简要描述我正在尝试做的事情。在这一点上,我对这个主题的理解充其量只是初步的。我的方法是否像我想象的那样可行?

  1. 我在 Concurrent 集合中有 100,000 个 url 必须进行测试——链接仍然有效吗?我有另一个并发集合,最初是空的,它将包含异步请求确定已移动的 url 子集(400、404 等错误)。

  2. 我想在我的电脑和我们的带宽允许的情况下同时产生尽可能多的这些异步请求,并且将从每秒 20 个异步网络请求任务开始,然后从那里开始。

如果单个异步任务同时处理这两件事,它会起作用吗:它会发出异步请求,然后如果遇到 4xx 错误,则将 url 添加到 BadUrls 集合中?该任务的一个新实例将每 50 毫秒产生一次:

可行的?走开?

0 投票
1 回答
265 浏览

c# - A Blocking Concurrent Collection - Take 方法获取支持条件的项目

我想要一个支持阻塞线程安全Take操作的并发集合,而实际采用的项目是满足条件的项目。

就像是:

最终目标是获取集合中当前存在的具有最高属性值的项目。例如 - 最大

有这样的内置集合吗?

如果不是,那么更好的选择是什么?

0 投票
1 回答
1012 浏览

c# - ConcurrentKeyedCollection 方法

我想使用 ConcurrentKeyedCollection - 但它不存在。
为什么没有 ConcurrentKeyedCollection?
我应该使用什么?(ConcurrentDictionary?围绕 KeyedCollection 包装我自己的并发保护?)

0 投票
1 回答
125 浏览

c# - 使用 ConcurrentCollections 的 Plinq 和对象池

我有一个方法必须遍历大量数据并将处理后的结果返回给消费者线程以进行序列化。流式 Plinq 最适合性能。

因为这些操作很频繁,所以我使用对象池来缓存容器以进行处理,以尽量减少对象创建。我尝试使用并发堆栈实现对象池(concurrentbag 和 concurrentqueue 表现出相同的问题)。在同样罕见的情况下,同一个线程从池中获取同一个项目(查看哈希码),尽管它没有被消费者线程释放。我在池的获取和释放方法中添加了跟踪,这是输出:

5:11:32.250 PM 为线程 31 获取项目 16071020
5:11:32.254 PM 为线程 31 获取项目 16071020 5:11:32.260 PM
为线程 27 放置项目 16071020
5:11:32.286 PM 为线程 27 放置项目 16071020

这是我正在使用的代码:

在 Process 方法中,我将从池中获取对象:

池类实现:

我不知道如何防止这种情况的发生。关于为什么会发生这种情况以及如何防止它的任何想法?

0 投票
4 回答
15213 浏览

c# - .NET 4.0 并发收集性能

我正在尝试编写一个程序,通过将项目放在来自不同线程的集合中并在一个迭代集合并处理项目的单个线程中清理它们来安排要删除的项目。

在这样做之前,我想知道什么会产生最佳性能,所以我尝试了 ConcurrentBag、ConcurrentStack 和 ConcurrentQueue,并测量了添加 10000000 个项目所需的时间。

我使用以下程序对此进行了测试:

其中 # 是使用的线程数量。

但结果相当混乱:

有 8 个线程:

  • addList 需要 00:00:00.8166816
  • addBag 需要 00:00:01.0368712
  • addStack 需要 00:00:01.0902852
  • addQueue 需要 00:00:00.6555039

有 1 个线程:

  • addList 需要 00:00:00.3880958
  • addBag 需要 00:00:01.5850249
  • addStack 需要 00:00:01.2764924
  • addQueue 需要 00:00:00.4409501

因此,无论有多少线程,似乎只锁定一个普通的旧列表比使用任何并发集合都更快,但如果队列需要处理大量写入,则可能是队列。

编辑:在下面关于垃圾和调试构建的评论之后:是的,这会影响基准。调试构建影响将是线性的,垃圾会随着内存使用量的增加而增加。

然而多次运行相同的测试会得到大致相同的结果。

我将集合的初始化移到了测试运行之前,现在在运行之后收集垃圾,如下所示:

将 MaxDegreeOfParallelism 设置为 8,我得到以下结果:

  • addList 需要 00:00:7959546
  • addBag 需要 00:00:01.08023823
  • addStack 需要 00:00:01.1354566
  • addQueue 需要 00:00:00.6597145

每次运行代码时都会有 0.02 秒的偏差。

0 投票
1 回答
1323 浏览

.net - System.Collections.Concurrent 缺失的类

我有最终版本的 Visual Studio 2013 正在处理一个 MVC4 项目。.NET 4.5 是目标平台。当我引用System程序集时,我看到的只是名称空间BlockingCollection<T>ConcurentBag<T>的内容。System.Collections.Concurrent根据文档,应该有更多的类。我ConcurrentDictionary<TKey, TValue>特别在寻找这里。

程序集的完整路径: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll

更新:当我尝试引用时mscorlib.dll出现错误A reference to 'mscorlib' could not be added. This component is already automatically referenced by the build system.

0 投票
2 回答
95 浏览

c# - 并发集合从不同线程修改是否安全

假设我有:

我现在可以安全地MyCollection. 但是修改项目呢。例如,这样做是否安全:


示例 2:

这样做安全吗?

其中 Thread1 和 Thread2 同时执行。修改项目时是否必须创建锁?

0 投票
0 回答
597 浏览

data-structures - 用Java实现通讯录的数据结构

Concurrent collections 包中的哪种数据结构适合实现地址簿?