gpt4 book ai didi

c# - 使用 AutoResetEvent 的生产者消费者

转载 作者:行者123 更新时间:2023-11-30 22:48:08 26 4
gpt4 key购买 nike

我正在尝试使用生产者消费者模式来处理和保存一些数据。我正在使用 AutoResetEvent 在两个 therads 之间发送信号,这里是我的代码

这里是生产者函数

 public Results[] Evaluate()
{
processingComplete = false;
resultQueue.Clear();
for (int i = 0; i < data.Length; ++i)
{
if (saveThread.ThreadState == ThreadState.Unstarted)
saveThread.Start();
//-....
//Process data
//
lock (lockobject)
{
resultQueue.Enqueue(result);
}

signal.Set();
}
processingComplete = true;
}

这里是消费者函数

   private void SaveResults()
{
Model dataAccess = new Model();

while (!processingComplete || resultQueue.Count > 0)
{
if (resultQueue.Count == 0)
signal.WaitOne();
ModelResults result;
lock (lockobject)

{
result = resultQueue.Dequeue();
}
dataAccess.Save(result);
}
SaveCompleteSignal.Set();
}

所以我的问题有时是 resultQueue.Dequeue() 抛出 InvalidOperation 异常,因为队列是空的。我不确定我做错了什么,上面那个 block 的 signal.WaitOne() 不应该是队列是空的吗?

最佳答案

由于缺乏适当的锁定,您遇到了同步问题。

您应该锁定所有队列访问,包括计数检查。

此外,使用 Thread.ThreadState以这种方式是一个“坏主意”。来自 ThreadState 的 MSDN 文档:

"Thread state is only of interest in debugging scenarios. Your code should never use thread state to synchronize the activities of threads."

您不能依赖它作为处理同步的方法。您应该重新设计以确保线程在使用之前启动。如果它没有启动,就不要初始化它。 (您始终可以使用空检查 - 如果线程为空,则创建并启动它)。

关于c# - 使用 AutoResetEvent 的生产者消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1882930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com