J'ai besoin de mettre en œuvre une file d'attente limitée par le producteur/consommateur, plusieurs consommateurs contre un seul producteur.Scénario de file d'attente bornée
J'ai une fonction de poussée qui ajoute un élément à la file d'attente, puis vérifie la taille maximale. Si nous l'avons atteint, renvoyez false, dans tous les autres cas, renvoyez true.
Dans le code suivant _vector est une liste <T>, onSignal consomme fondamentalement un élément d'une manière asynchrone.
Avez-vous des problèmes avec ce code?
public bool Push(T message)
{
bool canEnqueue = true;
lock (_vector)
{
_vector.Add(message);
if (_vector.Count >= _maxSize)
{
canEnqueue = false;
}
}
var onSignal = SignalEvent;
if (onSignal != null)
{
onSignal();
}
return canEnqueue;
}
Aaronaught, merci pour vos commentaires rapides pas de producteurs multiples dans un avenir prévisible, mais la taille maximale est également une suggestion lâche ... je n'ai pas besoin de l'appliquer strictement. SignalEvent est déclaré comme > événement interne Action SignalEvent; Je ne suis pas familier avec le SynchronizedAtribute ... va vérifier. Je construis ça en plus de retlang ... ça aide vraiment en termes de fournir un cadre général pour les applications multithread – lboregard
@lboregard: Vous n'avez pas besoin de vous soucier de 'SynchronizedAttribute' si vous n'utilisez pas' ' Méthodes add'/'remove' sur le délégué - le compilateur les génère pour vous. C'est seulement lorsque vous remplacez le comportement par défaut que vous devez implémenter le verrouillage personnalisé. Cela semble être largement non documenté mais il est assez bien connu. – Aaronaught