示例
Program.cs
namespace WaitPulseExample
{
internal class Program
{
static void Main(string[] args)
{
Producer producer = new Producer();
Consumer consumer = new Consumer();
ThreadStart ts1 = new ThreadStart(producer.Produce);
ThreadStart ts2 = new ThreadStart(consumer.Consume);
Thread producerThread = new Thread(ts1) { Name = "Producer Thread" };
Thread consumerTherad = new Thread(ts2) { Name = "Consumer Thread" };
producerThread.Start();
consumerTherad.Start();
producerThread.Join();
consumerTherad.Join();
Console.ReadKey();
}
}
static class Shared
{
public static object LockObject = new object();
public static Queue<int> Buffer = new Queue<int>();
public const int BufferCapacity = 5;
public static void Print()
{
Console.WriteLine("Buffer: ");
foreach (int i in Buffer)
{
Console.Write($"{i}, ");
}
Console.WriteLine();
}
}
class Producer
{
public void Produce()
{
Console.WriteLine($"Producer: Generating Data.");
Console.WriteLine($"Producer: Completed.");
}
}
class Consumer
{
public void Consume()
{
Console.WriteLine($"Consumer: Consuming Data.");
for (int i = 0; i < Shared.BufferCapacity; i++)
{
lock (Shared.LockObject)
{
if (Shared.Buffer.Count <= 0)
{
Console.WriteLine("Buffer is empty. Waiting for signal from producer.");
Monitor.Wait(Shared.LockObject);
}
}
Console.WriteLine("Consumer: Processing Data.");
Thread.Sleep(2500);
lock (Shared.LockObject)
{
int value = Shared.Buffer.Dequeue();
Console.WriteLine($"Consumer consumed: {value}");
}
}
Console.WriteLine($"Consumer: Completed.");
}
}
}