我想这是一种代码审查,但这里是我的生产者/消费者模式的实现。我想知道的是会有这种情况,ReceivingThread()
或SendingThread()
方法中的while循环可能会停止执行。请注意,从多个不同的线程调用EnqueueSend(DataSendEnqeueInfo info)
,我可能无法在这里使用任务,因为我必须在单独的线程中使用命令。生产者/消费者模式使用线程和EventWaitHandle
private Thread mReceivingThread;
private Thread mSendingThread;
private Queue<DataRecievedEnqeueInfo> mReceivingThreadQueue;
private Queue<DataSendEnqeueInfo> 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();
}
}
P.S这里的想法是,我使用WaitHandle
s到放线时,队列为空睡觉,而它们的信号新项目时排队开始。
UPDATE 我只想离开这个https://blogs.msdn.microsoft.com/benwilli/2015/09/10/tasks-are-still-not-threads-and-async-is-not-parallel/,为人们谁可能是试图实现使用TPL或任务生产者/消费者模式。
您最好使用[BlockingCollection](https://msdn.microsoft.com/en-us/library/dd267312(v = vs.110).aspx),它可以为您处理所有同步逻辑。 –
阻止收集是一个不错的选择,但是,您也可以尝试[TPL Dataflow](https://msdn.microsoft.com/zh-cn/library/hh228601.aspx)。如果需要,我可以提供一些示例逻辑。 – VMAtm
@VMAtm我一直想绕过TPL数据流。如果你能给我提供一些示例逻辑,当然,只有在它没有太多的麻烦的情况下,这将是很有用的。 –