为什么ConcurrentQueue提供TryPeek()和TryDequeue(),而Queue提供Peek()和Dequeue()?

Jai*_*Jai 2 .net c#

API 如此设计有什么原因吗?据我所知,“尝试”和“非尝试”方法之间的区别只是获得或InvalidOperationException不获得 - 我不明白它与线程安全有什么关系。Queue这里有一个小问题 - 为什么和不ConcurrentQueue实现像 那样的通用接口,它将提供统一的方法,无论是否IQueue使用?Try...

Mic*_*zyn 5

在同步上下文中,您可以Count在出队之前检查属性。因此,如果您同步运行代码,这足以防止异常(就像数组一样,您可能会IndexOutOfRangeexception由于简单的编程错误而导致异常 - 不检查可用性)。

在多线程代码中,这是不可能的 - 两个线程可以检查,即Count1 并且都可以输入一段代码,其中最后一个元素出队,除非您使用Semaphoreor lock(或其他同步方法),否则您不确定出队是否会成功。或不。因此TryDequeue