我已经在现有帖子中搜索了这个错误,但我没有解决我在那里发现的问题。
我使用锁和2个监视器对象来实现消费者 - 生产者问题。但是当我运行代码时,得到以下错误'对象同步方法是从一个不同步的代码块中调用的。'。 我已经发现了我的代码:
ProducerConsumer.cs:
using System;
using System.Collections.Generic;
using System.Threading;
namespace ProducerConsumer
{
public class ProducerConsumer
{
private Queue<int> _items;
private object _lockObject;
private object _condProd;
private object _condCons;
public ProducerConsumer()
{
_items = new Queue<int>();
_lockObject = new object();
_condProd = new object();
_condCons = new object();
}
public void Produce(string name)
{
int count = 1;
bool produced = false;
while (true)
{
if (produced == false)
{
Console.WriteLine(name + "/Produced: " + count);
Thread.Sleep(50);
produced = true;
count++;
}
lock (_lockObject)
{
while (_items.Count == 5)
{
Monitor.Wait(_condProd);
}
_items.Enqueue(count);
}
Monitor.Pulse(_condCons);
produced = false;
}
}
public void Consume(string name)
{
int count = 0;
while (true)
{
lock (_lockObject)
{
while (_items.Count == 0)
{
Monitor.Wait(_condCons);
}
count = _items.Dequeue();
Console.WriteLine(name + "/Scos din lista: " + count);
}
Monitor.Pulse(_condProd);
}
}
}
}
Program.cs:
using System;
using System.Threading.Tasks;
namespace ProducerConsumer
{
class Program
{
static void Main(string[] args)
{
ProducerConsumer pc = new ProducerConsumer();
Task p = Task.Factory.StartNew(() => pc.Produce("Producer 1"));
Task c = Task.Factory.StartNew(() => pc.Consume("Consumer 1"));
Task.WaitAll(p, c);
Console.ReadKey();
}
}
}
请帮助我理解为什么我会收到此错误以及如何解决它,我是C#语言的线程部分的新手。提前谢谢。
答案 0 :(得分:0)
要致电Monitor.Pulse(_condCons);
,您需要锁定_condCons
;要致电Monitor.Wait(_condProd);
,您需要锁定_condProd
。目前尚不清楚 wait 是否锁定正确的对象,并且脉冲似乎没有锁定任何对象。