2010-09-13 40 views
12

Necesito crear una cola priorty de bloqueo y mi corazonada es que TakeFromAny puede ser el ingrediente secreto, sin embargo, la documentación sobre ese método es escasa. ¿Cuál es su propósito/uso apropiado/¿Qué es el método BlockingCollection.TakeFromAny útil para

Mi requisito es que varios hilos se agregarán a una cola de alta prioridad o de baja prioridad. Un hilo consumirá estas dos colas siempre tomando de la cola de alta prioridad antes de la cola de bajo priorty.

Es muy posible que ni el método BlockingCollection ni el método TakeFromAny me sirvan. Si es así, un indicador en la dirección correcta sería apreciado.

Respuesta

11

Tienes razón. La documentación es bastante escasa. Sin embargo, eché un vistazo a la implementación a través de Reflector y creo que puedes usar el método BlockingCollection.TakeFromAny para simular el sesgo de prioridad que deseas. La razón es porque la implementación usa el método WaitHandle.WaitAny que devuelve el índice más pequeño de todos los objetos señalados. Eso significa que si tiene dos o más colas con elementos disponibles, siempre se seleccionará la cola que aparece primero en la matriz.

El siguiente código siempre debe salir "alto".

var low = new BlockingCollection<object> { "low" }; 
var high = new BlockingCollection<object> { "high" }; 
var array = new BlockingCollection<object>[] { high, low }; 
object item; 
int index = BlockingCollection<object>.TakeFromAny(array, out item); 
Console.WriteLine(item); 
+1

Gracias brian por esta muy oportuna respuesta. Tu respuesta concuerda con lo que estaba observando. Mi preocupación ahora es que, dado que este comportamiento no está documentado, ¿qué tanto riesgo tomaré si confío en que no cambiará de una versión a otra? –

+1

@Ralph: Entiendo su preocupación. Sospecho que este es el comportamiento exacto que Microsoft estaba buscando, así que mi * corazonada * es que siempre se comportará de esta manera. Definitivamente sería bueno obtener esa información crítica añadida a la documentación para su confirmación, ¿eh? –

+1

¿No se llamaría 'TakeFromFirstAvailable' si ese fuera el comportamiento que MS estaba buscando? – Gabe

Cuestiones relacionadas