Quel est le moyen le plus efficace de surveiller une file d'attente?Méthode la plus efficace pour surveiller une file d'attente
La pièce follwoing de code est le plus grand porc des ressources:
/// <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));
}
}
}
}
}
Démarrer le service fonctionne sur un fil d'arrière-plan, l'appel à _MessageQueue.Count est pas sûre, je ne suis pas de verrouillage sur le nombre dans MessageQueue. Je bloque cependant l'implémentation de _MessageQueue.GetMessageFromQueue. Est-ce que le chemin que j'ai parcouru à ce sujet est efficace? Dois-je plutôt élever un événement Chaque fois que la file d'attente passe d'un nombre de 0 à plus de zéro?
Non dort, sauf si vous avez aucun contrôle sur le producteur. Utilisez des événements ou des signaux pour faire des attentes/notifications appropriées. –
Pourquoi Mats? J'ai le contrôle sur le producteur. Devrais-je déclencher un événement lorsqu'un élément est ajouté à la file d'attente? Je vais regarder dans waithandle. – AndyMM
+1. Voir ma réponse pour un exemple. – dtb