Подтвердить что ты не робот

При каких обстоятельствах может произойти сбой ConcurrentBag.TryTake()?

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

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

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

Может ли это быть так?

4b9b3361

Ответ 1

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

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

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

Возврат: true, если объект удален успешно; в противном случае - false.

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

Ответ 2

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

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