2011-01-06 10 views
11

Estoy pensando en usar un ConcurrentBag en un programa que estoy escribiendo, sin embargo, parece que no encuentro suficiente documentación en TryTake.¿Bajo qué circunstancias puede fallar ConcurrentBag.TryTake()?

Entiendo que el método podría fallar, pero no puedo encontrar una explicación de los casos en los que podría ocurrir tal falla, y en qué estado quedará la recopilación después de la falla.

Si es solo en el caso de que otro hilo ya haya eliminado el elemento, no me importa, pero lo que realmente no puedo permitir es que el artículo que deseo quitar siga en la colección después de la llamada.

¿Puede ser este el caso?

+1

Algún código (que falla) y los detalles de la excepción que obtienes ayudarán! – decyclone

+6

@decyclone, no tiene el código que falla, pregunta bajo qué condiciones podría fallar el método TryTake y cuál sería el estado de la colección después de la falla. –

Respuesta

3

De la documentación devuelve falso si no hay ningún elemento disponible para llevar, es decir, la bolsa está vacía. Como es una colección segura para subprocesos, no debería haber problemas en torno a los hilos "vacíos" y múltiples.

usted tiene que tomar la documentación de result T así como la return value en consideración:

resultado T: Cuando esto devuelve el método, resultado contiene el objeto eliminado del ConcurrentBag o el valor predeterminado de T si el la bolsa esta vacia

Retorno: verdadero si un objeto se eliminó correctamente; de lo contrario, falso.

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

+1

Buena interpretación, pero documentación deficiente ... – em70

3

Dado que usted está tratando con múltiples hilos, no hay nada que impida a otro hilo de añadiendo un elemento a la bolsa entre el momento en que TryTake ha decidir volver falsa (y establece que es valor de retorno a default(T)), y el momento en el que la llamada a TryTake realmente retorna a su código.

Por lo tanto, para el momento en que pueda manejar el resultado falso, es posible que en realidad haya un elemento en la bolsa.

+0

Gracias, pero el código involucrado es simplemente asegurarse de que un determinado recurso se use solo una vez por usuario, por lo tanto, si el usuario decide enviar un log en breve seguido de un inicio de sesión y para algunos Razón por la cual los dos se procesan casi al mismo tiempo, no es motivo de preocupación. Sin embargo, la incapacidad de cerrar la sesión o de iniciar sesión incorrectamente, habría sido un problema, de ahí la pregunta. – em70

Cuestiones relacionadas