D'abord, vous devriez envisager d'utiliser un ConcurrentQueue <> insted d'une Liste <>. ConcurrentQueue <> est complètement sécurisé et ne nécessite aucun verrou supplémentaire. Avec cela, vous vous êtes déjà épargné un verrou pour la file d'attente des messages. Interlocked fournit l'atomicité, quand elle n'est pas disponible.
Selon le C# language specification, lit indépendant/écriture sont atomiques (mais seulement pour certains types de données et à long est pas toujours atomique - c'est pourquoi je changeai le DateTime.Now.Ticks
pour obtenir un int32 sans perdre de bits qui influencera la durée écoulée time) et read-modify-write (par exemple ++ i) n'est jamais atomique.
Le décalage (par exemple, < <) est indépendant et ne nécessite aucun verrouillage supplémentaire.
private ConcurrentQueue<Message> Queue = new ConcurrentQueue<Message>();
private int QueueSize = 0;
private int LastSend = (int)(DateTime.Now.Ticks >> 23);
private int LastMessage = (int)(DateTime.Now.Ticks >> 23);
public void GotNewMessage(Message Message)
{
Queue.Enqueue(Message);
Interlocked.Increment(ref QueueSize);
Interlocked.Exchange(ref LastMessage, (int)(DateTime.Now.Ticks >> 23));
if (Interlocked.CompareExchange(ref QueueSize, 0, 100) >= 100 ||
LastMessage - LastSend >= 60)
{
Message Dummy;
while (!Queue.IsEmpty)
if (Queue.TryDequeue(out Dummy))
SendMessage(Dummy);
Interlocked.Exchange(ref LastSend, (int)(DateTime.Now.Ticks >> 23));
}
}
public void SendMessage(Message Message)
{
// ...
}
Edit: Il peut se produire, qui sont envoyés plus de 100 messages. Si vous souhaitez envoyer uniquement 100 messages, vous pouvez implémenter une autre incrémentation atomique dans le cycle.
Must vous l'implémentez vous-même? Il y a toute une bibliothèque pour faire ce genre de chose.Dans votre pseudo implémentation, si quelque chose ne venait pas pendant deux minutes, vous perdriez votre comportement d'une minute. Vous devez maintenir le temporisateur externe à la méthode et l'appeler des gestionnaires d'événements par rapport au temporisateur. – pinkfloydx33