¿Es eficiente aSpinWait vs espera en espera. ¿Cuál usar?
SpinWait.SpinUntil(() => myPredicate(), 10000)
para un tiempo de espera de 10000ms
o
¿Es más eficaz utilizar Thread.Sleep
de votación para la misma condición Por ejemplo algo en la línea de la siguiente SleepWait
función:
public bool SleepWait(int timeOut)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (!myPredicate() && stopwatch.ElapsedMilliseconds < timeOut)
{
Thread.Sleep(50)
}
return myPredicate()
}
Soy la estafa ¿Está seguro de que todo el rendimiento de SpinWait puede no ser un buen patrón de uso si estamos hablando de tiempos de espera superiores a 1 segundo? ¿Es esto una suposición válida?
¿Qué enfoque prefiere y por qué? ¿Hay otro enfoque aún mejor?
actualización - Ser más específico:
¿Hay una manera de hacer BlockingCollection pulso un hilo de dormir cuando llega a la capacidad limitada? Prefiero evitar las agitadas esperas, como sugiere Marc Gravel.
Gracias, me gusta su respuesta, esto sería bonito. Supongamos que está rastreando el uso de algunos recursos a través de BlockingCollection. Se usan (y se eliminan de la colección) y se devuelven a la colección cuando vuelven a estar disponibles para su reutilización. Un cierre solo puede ocurrir cuando todos estos han regresado a la colección. ¿Cómo harías para indicar que un cierre puede continuar (es decir, la recolección está llena otra vez) que no sea esperar ocupado? – Anastasiosyal
@Anastasiosyal Encapsularía la colección y haría que el envoltorio hiciera algo cuando estuviera completo; de hecho, probablemente usaría un 'Monitor' para esto (agregaré un ejemplo) –
En el destructor de una clase 'ObjectPool' que desciende de BlockingQueue, extraiga todos los objetos del BlockingCollection uno por uno y deséchelos, (como esto es C#, establezca la referencia recuperada en nil), hasta que la cantidad de objetos reventados sea igual a la profundidad de la agrupación. Todos los objetos agrupados se han eliminado, por lo que puede deshacerse de la cola y regresar del dtor para continuar con la secuencia de apagado. ¡No se requiere votación/ocupado! Es posible que desee poner un poco de tiempo de espera en la toma para que un objeto filtrado genere una excepción (o algo). –