Jaki jest najbardziej efektywny sposób monitorowania kolejki.Najbardziej efektywny sposób monitorowania kolejki
follwoing kawałek kodu jest największym wieprz zasobów:
/// <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 Usługa działa w wątku tła, wezwanie do _MessageQueue.Count nie jest wątku bezpieczne, nie jestem blokowania na licznik w kolejka komunikatów. Jednak blokuję implementację _MessageQueue.GetMessageFromQueue. Czy sposób, w jaki postępowałem tak skutecznie? Czy powinienem raczej podnieść zdarzenie Za każdym razem, gdy kolejka przechodzi od liczby 0 do większej od zera?
Nie śpi, chyba że masz żadnej kontroli nad producenta. Użyj zdarzeń lub sygnałów, aby wykonać odpowiednie oczekiwanie/powiadomienia. –
Dlaczego Mats? Mam kontrolę nad producentem. Czy powinienem zgłaszać wydarzenie, gdy element zostanie dodany do kolejki? Zajrzę do waithandle. – AndyMM
+1. Zobacz moją odpowiedź na przykład. – dtb