我是.NET / Threads的新手,我想知道是否有人可以帮助我完成这项练习。我需要替换注释,以便在不锁定线程的情况下使其工作:
private Queue<int> queue;
public void ConsumeFunc(){
while (true){
// 1
while (/* 2 */){
// 3
}
int element = queue.Dequeue();
// 4
Console.WriteLine("Consume element: " + element);
Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000);
}
}
private void ProduceFunc(){
while (true) {
// 1
queue.Enqueue(DateTime.Now.Millisecond);
// 2
// 3
Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000);
}
}
我管理了这个,但还没有完成
public void ConsumerFunc(){
while (true){
Monitor.PulseAll(queue); // 1
while (queue.Count == 0){ /* 2 */
Monitor.Wait(queue); // 3
}
int element = queue.Dequeue();
lock (queue) // 4
Console.WriteLine("Consume element: " + element);
Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000);
}
}
public void ProducerFunc(){
while (true) {
lock (queue) // 1
queue.Enqueue(DateTime.Now.Millisecond);
Monitor.PulseAll(queue); // 2
// 3 ???
Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 3) * 1000);
}
}
并给出以下错误:
从非同步代码块 调用对象同步方法,
在Monitor.PulseAll(queue);
答案 0 :(得分:1)
不要自己努力实现同步,而是看看BlockingCollection。它为您处理所有同步,并且比使用Queue
类和Monitor
创建的任何内容都要好。
.NET文档中有很多示例,这里有Stack Overflow和其他地方。您可能会发现我的文章很有用:http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821