Was ist der effizienteste Weg, um eine Warteschlange zu überwachen.Der effizienteste Weg, um eine Warteschlange zu überwachen
Das follwoing Stück Code das größte Schwein von Ressourcen:
/// <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));
}
}
}
}
}
Start Service auf Hintergrund-Thread ausgeführt wird, wird der Anruf an _MessageQueue.Count nicht Thread-sicher, ich bin Verriegelung nicht Zählung in Message auf. Ich sperre jedoch die Implementierung von _MessageQueue.GetMessageFromQueue. Bin ich so effizient gegangen? Soll ich eher ein Ereignis auslösen, wenn die Warteschlange von einer Zählung von 0 auf eine größere als Null geht?
Nein schläft, wenn Sie keinerlei Kontrolle über den Hersteller haben. Verwenden Sie Ereignisse oder Signale, um ordnungsgemäße Wartungen/Benachrichtigungen durchzuführen. –
Warum Matten? Ich habe die Kontrolle über den Produzenten. Sollte ich ein Ereignis auslösen, wenn ein Element zur Warteschlange hinzugefügt wird? Ich werde in Waithandle schauen. – AndyMM
+1. Siehe meine Antwort für ein Beispiel. – dtb