Produzent/ Verbrauchermuster mit Threads und EventWaithandleC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Produzent/ Verbrauchermuster mit Threads und EventWaithandle

Post by Anonymous »

Ich denke, es ist eine Art Codeüberprüfung, aber hier ist meine Implementierung des Produzenten- / Verbrauchermusters. Was ich wissen möchte, ist, dass es einen Fall geben würde, in dem die während der Aufnahme von Thread () oder sendingThread () Methoden möglicherweise aufhören, auszuführen. Bitte beachten Sie, dass EnqueueSend (DataSendenQeueInfo -Info) < /code> aus mehreren verschiedenen Threads aufgerufen wird, und ich kann hier wahrscheinlich keine Aufgaben verwenden, da ich definitiv Befehle in einem separaten Thread konsumieren muss. < /P>

private Thread mReceivingThread;
private Thread mSendingThread;
private Queue mReceivingThreadQueue;
private Queue mSendingThreadQueue;
private readonly object mReceivingQueueLock = new object();
private readonly object mSendingQueueLock = new object();
private bool mIsRunning;
EventWaitHandle mRcWaitHandle;
EventWaitHandle mSeWaitHandle;

private void ReceivingThread()
{
while (mIsRunning)
{
mRcWaitHandle.WaitOne();
DataRecievedEnqeueInfo item = null;
while (mReceivingThreadQueue.Count > 0)
{
lock (mReceivingQueueLock)
{
item = mReceivingThreadQueue.Dequeue();
}
ProcessReceivingItem(item);
}
mRcWaitHandle.Reset();
}
}

private void SendingThread()
{
while (mIsRunning)
{
mSeWaitHandle.WaitOne();
while (mSendingThreadQueue.Count > 0)
{
DataSendEnqeueInfo item = null;
lock (mSendingQueueLock)
{
item = mSendingThreadQueue.Dequeue();
}
ProcessSendingItem(item);
}
mSeWaitHandle.Reset();
}
}

internal void EnqueueRecevingData(DataRecievedEnqeueInfo info)
{
lock (mReceivingQueueLock)
{
mReceivingThreadQueue.Enqueue(info);
mRcWaitHandle.Set();
}
}

public void EnqueueSend(DataSendEnqeueInfo info)
{
lock (mSendingQueueLock)
{
mSendingThreadQueue.Enqueue(info);
mSeWaitHandle.Set();
}
}
< /code>

P.S Die Idee hier ist, dass ich WaitHandle < /code> S Thread in den Schlaf einfügt, wenn die Warteschlange leer ist, und signalisieren, dass sie starten, wenn neue Elemente aufgenommen werden. https://blogs.msdn.microsoft.com/benwil ... t-parallel>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post