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

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

问题描述:

我正在考虑在我正在编写的程序中使用ConcurrentBag,但我似乎无法在TryTake上找到足够的文档。ConcurrentBag.TryTake()在什么情况下会失败?

我知道这个方法可能会失败,但我找不到可能发生此类故障的情况的解释,以及收集失败后将保留的状态。

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

这可以吗?

+1

某些代码(失败)和异常的细节你会得到帮助! – decyclone 2011-01-06 10:54:48

+6

@decyclone,他没有得到失败的代码,他问在什么情况下TryTake方法可能会失败,以及失败后集合的状态。 – 2011-01-06 10:59:58

从文档中返回false,如果没有物品可用,即袋子是空的。因为它是一个线程安全的集合,所以在'空'和多个线程周围不应该有任何问题。

你必须采取用于result T的文档以及所述return value考虑:

结果T:此方法返回时,结果包含从ConcurrentBag或T的,如果默认值除去对象袋子是空的。

返回:如果对象成功移除,则返回true;否则,是错误的。

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

+1

好的解释,但很差的文档... – em70 2011-01-06 11:16:42

既然你正在处理多线程,没有什么可以阻止另一个线程加入在这TryTake已经决定返回false一瞬之间袋的物品(和设置它的返回值为default(T)),以及TryTake实际返回到您的代码的时刻。

所以,当你能够处理错误的结果时,袋子里实际上可能有一件物品。