ConcurrentBag.TryTake()在什么情况下会失败?
问题描述:
我正在考虑在我正在编写的程序中使用ConcurrentBag,但我似乎无法在TryTake上找到足够的文档。ConcurrentBag.TryTake()在什么情况下会失败?
我知道这个方法可能会失败,但我找不到可能发生此类故障的情况的解释,以及收集失败后将保留的状态。
如果只是在另一个线程已经删除了该项目的情况下,我不在乎,但我真正无法承受的是我想删除的项目仍然在通话后的集合中。
这可以吗?
答
从文档中返回false,如果没有物品可用,即袋子是空的。因为它是一个线程安全的集合,所以在'空'和多个线程周围不应该有任何问题。
你必须采取用于result T
的文档以及所述return value
考虑:
结果T:此方法返回时,结果包含从ConcurrentBag或T的,如果默认值除去对象袋子是空的。
返回:如果对象成功移除,则返回true;否则,是错误的。
+1
好的解释,但很差的文档... – em70 2011-01-06 11:16:42
答
既然你正在处理多线程,没有什么可以阻止另一个线程加入在这TryTake
已经决定返回false一瞬之间袋的物品(和设置它的返回值为default(T)
),以及TryTake
实际返回到您的代码的时刻。
所以,当你能够处理错误的结果时,袋子里实际上可能有一件物品。
某些代码(失败)和异常的细节你会得到帮助! – decyclone 2011-01-06 10:54:48
@decyclone,他没有得到失败的代码,他问在什么情况下TryTake方法可能会失败,以及失败后集合的状态。 – 2011-01-06 10:59:58