j'ai un modèle producteur-consommateur travaillant pour un seul produit. Quelle est la meilleure mise en œuvre lorsque le producteur produit de nombreux produits? Par exemple un DataBaseEvent, GuiEvent et ControlEvent que le consommateur doit consommer. Le code ci-dessous montre le modèle pour un produit (un DataBaseEvent). Chaque type d'événement doit-il être mis en file d'attente dans sa propre file d'attente ou doit-il hériter d'une classe de base pouvant être mise en file d'attente? Peut-être qu'il existe un meilleur modèle lorsque vous travaillez avec de nombreux types d'événements?modèle producteur-consommateur lorsque de nombreux produits
class DataBaseEventArgs : EventArgs
{
public string textToDB = "";
}
class Consumer
{
private Producer mProducer = new Producer();
private Queue<DataBaseEventArgs> mDataBaseEventQueue = new Queue<DataBaseEventArgs>();
private static EventWaitHandle mDataBaseEventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
private Thread mDataBaseEventDequeueThread = null;
public Consumer()
{
mDataBaseEventDequeueThread = new Thread(DataBaseDequeueEvent);
mDataBaseEventDequeueThread.Start();
mProducer.mDataBaseEventHandler += WhenDataBaseEvent;
}
protected void DataBaseDequeueEvent()
{
while (true)
{
DataBaseEventArgs e;
lock (((ICollection)mDataBaseEventQueue).SyncRoot)
{
if (mDataBaseEventQueue.Count > 0)
{
e = mDataBaseEventQueue.Dequeue();
}
}
// WriteToDatabase(e.textToDB);
if (mDataBaseEventQueue.Count == 0)
{
mDataBaseEventWaitHandle.WaitOne(1000);
mDataBaseEventWaitHandle.Reset();
}
}
}
internal void WhenDataBaseEvent(object sender, DataBaseEventArgs e)
{
lock (((ICollection)mDataBaseEventQueue).SyncRoot)
{
mDataBaseEventQueue.Enqueue(e);
mDataBaseEventWaitHandle.Set();
}
}
}
class Producer
{
public event EventHandler<DataBaseEventArgs> mDataBaseEventHandler = null;
public void SendDataBaseEvent()
{
if (mDataBaseEventHandler != null)
{
DataBaseEventArgs e = new DataBaseEventArgs();
e.textToDB = "This text will be written to DB";
mDataBaseEventHandler(this, e);
}
}
}
Merci pour l'exemple de code de moniteur. Je pense que je vais utiliser cela au lieu de l'EventWaitHandler. – humcfc