При каких обстоятельствах может произойти сбой ConcurrentBag.TryTake ()? - PullRequest
11 голосов
/ 06 января 2011

Я думаю об использовании ConcurrentBag в программе, которую я пишу, однако я не могу найти достаточно документации по TryTake .

Я понимаю, что метод может завершиться с ошибкой, но не могу найти объяснения случаев, когда такой сбой может произойти, и в каком состоянии коллекция будет оставлена ​​после сбоя.

Если только другой поток уже удалил элемент, мне все равно, но я не могу себе позволить, чтобы элемент, который я хочу удалить, оставался в коллекции после вызова.

Может ли это быть когда-нибудь?

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Учитывая, что вы имеете дело с многопоточностью, ничто не мешает другому потоку добавить элемент в сумку между моментом, когда TryTake решил вернуть значение false (и установить его возвращаемое значениена default(T)), и момент, когда вызов TryTake фактически возвращается к вашему коду.

Таким образом, к тому времени, когда вы сможете обработать ложный результат, в действительности может быть элемент всумка.

3 голосов
/ 06 января 2011

Из документации возвращается false, если нет доступных предметов, чтобы взять, т. Е. Сумка пуста. Поскольку это потокобезопасная коллекция, не должно быть проблем вокруг «пустых» и нескольких потоков.

Вы должны принять во внимание документацию для result T, а также return value:

результат T: при возврате этого метода результат содержит объект, удаленный из ConcurrentBag, или значение по умолчанию T, если мешок пуст.

Return: true, если объект был успешно удален; в противном случае - ложь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...