При каких обстоятельствах может произойти сбой ConcurrentBag.TryTake()?
Я думаю об использовании ConcurrentBag в программе, которую я пишу, однако я не могу найти достаточную документацию на TryTake.
Я понимаю, что метод может выйти из строя, но я не могу найти объяснения случаев, в которых может произойти такой сбой, и о том, какое состояние будет оставлено после сбоя.
Если только в случае другого потока, который уже удалил элемент, мне все равно, но то, что я не могу себе позволить, - это элемент, который я хочу удалить, чтобы все еще быть в коллекции после вызова.
Может ли это быть так?
Ответы
Ответ 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
действительно возвращается к вашему коду.
Таким образом, к тому моменту, когда вы сможете обрабатывать ложный результат, на самом деле может быть элемент в сумке.