C# Can ConcurrentQueue<;T>;将同一项目多次出列?

C# Can ConcurrentQueue<;T>;将同一项目多次出列?,c#,multithreading,C#,Multithreading,我使用ConcurrentQueue来管理一个要并行细化的项目队列,这时我意识到有些项目需要多次细化 我认为ConcurrentQueue是线程安全的,但现在我有这个疑问,如果同时并行访问TryDequeue方法,是否可能在不同的线程中两次返回相同的项 编辑 我不是在问为什么我的代码不起作用,所以假设一个可复制的示例是无用的,但这个问题确实有点愚蠢,你可以在Microsoft上轻松搜索到答案:不,一个项目仅由一个线程出列。ConcurrentQueue管理并发性 ConcurrentQueue在

我使用ConcurrentQueue来管理一个要并行细化的项目队列,这时我意识到有些项目需要多次细化

我认为ConcurrentQueue是线程安全的,但现在我有这个疑问,如果同时并行访问TryDequeue方法,是否可能在不同的线程中两次返回相同的项

编辑
我不是在问为什么我的代码不起作用,所以假设一个可复制的示例是无用的,但这个问题确实有点愚蠢,你可以在Microsoft上轻松搜索到答案:

不,一个项目仅由一个线程出列。ConcurrentQueue管理并发性

ConcurrentQueue在内部处理所有同步。如果两个线程恰好在同一时刻调用TryDequeue,则两个操作都不会被阻止。当两个线程之间检测到冲突时,一个线程必须再次尝试检索下一个元素,并且同步在内部处理

不同意:

TryDequeue
尝试从队列中删除元素。如果该方法成功,则删除该项,该方法返回
true
;否则,它将返回
false
。对于队列上的其他操作,这是原子性的。如果队列中填充了代码,如
q.Enqueue(“a”);q、 排队;q、 排队
和两个线程同时尝试将一个元素出列,一个线程将出列
a
,另一个线程将出列
b
。对
TryDequeue
的两个调用都将返回
true
,因为它们都能够使元素出列


如果你看到与此不同的行为,我们需要一个复制它的样本。我怀疑您的问题在其他地方。

我希望名称中包含
并发
的东西从定义上讲是线程安全的。你真的确定你可以把同一个项目排两次队吗?根据MSDN,ConcurrentQueue“代表线程安全的先进先出(FIFO)集合。”请用。很可能您多次将同一物品排队。我们必须查看一些代码。我没有发布代码,因为我没有要求您解决我的问题。我已经找到了另一个使用信号量的解决方案。我并不是说我确信问题与ConcurrentQueue有关,也不是问TrydQueque为什么两次返回相同的元素。我在问,TryDequeque是否可以返回相同的元素两次。如果是,好的,我学到了一些新的东西,如果不是,我将尝试进一步调查我的问题的原因。它不能。从文档中:
TryDequeue尝试从队列中删除元素。如果该方法成功,则删除该项并返回true;否则,它将返回false。这是相对于队列上的其他操作原子性地发生的。
这里的关键短语是相对于队列上的其他操作原子性地发生的