在什么情况下ConcurrentBag.TryTake()失败?

时间:2011-01-06 10:52:43

标签: c# .net collections concurrency

我正在考虑在我正在编写的程序中使用ConcurrentBag,但我似乎无法在TryTake上找到足够的文档。

我知道该方法可能会失败,但我无法找到可能发生此类失败的案例的解释,以及失败后收集将保留的状态。

如果只是在另一个线程已经删除了该项目的情况下,那么我不在乎,但我真正负担不起的是我想删除的项目仍然在通话后仍然在集合中。

这可能是这种情况吗?

2 个答案:

答案 0 :(得分:3)

如果没有可用的物品,那么从文件中它返回false,即行李是空的。因为它是一个线程安全的集合,所以“空”和多个线程之间应该没有问题。

您必须考虑result T以及return value的文档:

  

结果T:当此方法返回时,result包含从ConcurrentBag中删除的对象,如果包为空,则包含默认值T.

     

返回:如果成功删除了某个对象,则返回true;否则,错误。

http://msdn.microsoft.com/en-us/library/dd287255.aspx

答案 1 :(得分:3)

鉴于你正在处理多线程,在TryTake决定返回false(并设置)的那一刻,没有什么可以阻止将一个项目添加到包中的另一个线程它是default(T))的返回值,以及调用TryTake实际返回代码的时刻。

因此,当您能够处理错误结果时,包中可能会有一个项目。