2011-01-06 169 views
11

我正在考慮在我正在編寫的程序中使用ConcurrentBag,但我似乎無法在TryTake上找到足夠的文檔。ConcurrentBag.TryTake()在什麼情況下會失敗?

我知道這個方法可能會失敗,但我找不到可能發生此類故障的情況的解釋,以及收集失敗後將保留的狀態。

如果只是在另一個線程已經刪除了該項目的情況下,我不在乎,但我真正無法承受的是我想刪除的項目仍然在通話後的集合中。

這可以嗎?

+1

某些代碼(失敗)和異常的細節你會得到幫助! – decyclone 2011-01-06 10:54:48

+6

@decyclone,他沒有得到失敗的代碼,他問在什麼情況下TryTake方法可能會失敗,以及失敗後集合的狀態。 – 2011-01-06 10:59:58

回答

3

從文檔中返回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

3

既然你正在處理多線程,沒有什麼可以阻止另一個線程加入在這TryTake已經決定返回false一瞬之間袋的物品(和設置它的返回值爲default(T)),以及TryTake實際返回到您的代碼的時刻。

所以,當你能夠處理錯誤的結果時,袋子裏實際上可能有一件物品。

相關問題