¿Cuál es la forma más eficiente de monitorear una cola?Manera más eficiente de monitorear una cola
La pieza follwoing de código es el mayor de los recursos de cerdo:
/// <summary>
/// Starts the service.
/// </summary>
private void StartService()
{
while (true)
{
//the check on count is not thread safe
while (_MessageQueue.Count > 0)
{
Common.IMessage message;
// the call to GetMessageFromQueue is thread safe
if (_MessageQueue.GetMessageFromQueue(out message) == true)
{
if (message.RoutingInfo == Devices.Common.MessageRoutingInfo.ToDevice)
{
_Port.SerialPort.WriteLine(message.Message);
}
if (message.RoutingInfo == Devices.Common.MessageRoutingInfo.FromDevice)
{
OnDeviceMessageReceived(new Common.DeviceMessageArgs(message.Message));
}
}
}
}
}
Iniciar servicio se ejecuta en subproceso en segundo plano, la llamada a _MessageQueue.Count no es hilo de seguridad, no estoy de bloqueo en el recuento de MessageQueue. Sin embargo, bloqueo la implementación de _MessageQueue.GetMessageFromQueue. ¿Es esta la manera en que me he comportado de esta manera? ¿Debo plantear un evento cada vez que la cola pasa de un conteo de 0 a más de cero?
No se duerme menos que usted no tiene control alguno sobre el productor. Use eventos o señales para hacer las esperas/notificaciones adecuadas. –
¿Por qué esteras? Tengo control sobre el productor. ¿Debo plantear un evento cuando se agrega un artículo a la cola? Veré en el indicador de espera. – AndyMM
+1. Ver mi respuesta para un ejemplo. – dtb