1. 消息传递与队列
在 C# 中,消息传递是一种常见的并发编程模式。它通过使用消息队列作为交互媒介,在不同的线程之间进行通信和数据传递。以下是一个简单示例:
using System;
using System.Collections.Concurrent;
using System.Threading;
class Program
{
static BlockingCollection<string> messageQueue = new BlockingCollection<string>();
static void Producer()
{
for (int i = 0; i < 10; i++)
{
string message = $"Message {i + 1}";
messageQueue.Add(message);
Console.WriteLine($"Produced: {message}");
Thread.Sleep(1000);
}
messageQueue.CompleteAdding();
}
static void Consumer()
{
foreach (var message in messageQueue.GetConsumingEnumerable())
{
Console.WriteLine($"Consumed: {message}");
Thread.Sleep(2000);
}
}
static void Main()
{
Thread producerThread = new Thread(Producer);
Thread consumerThread = new Thread(Consumer);
producerThread.Start();
consumerThread.Start();
producerThread.Join();
consumerThread.Join();
Console.WriteLine("Done!");
}
}
上述代码中,我们使用 BlockingCollection
来实现了一个简单的消息队列。生产者线程通过调用 Add
方法向队列中添加消息,并输出相应的信息。消费者线程通过调用 GetConsumingEnumerable
方法从队列中获取消息,并进行处理。
2. 多线程与单线程
在 C# 中,使用多线程可以充分利用多核处理器的优势来提高程序的性能。然而,多线程编程也需要注意线程安全和共享资源的问题。
以下是一个简单的多线程示例:
using System;
using System.Threading;
class Program
{
static int counter = 0;
static object lockObject = new object();
static void Increment()
{
for (int i = 0; i < 100000; i++)
{
lock (lockObject)
{
counter++;
}
}
}
static void Main()
{
Thread thread1 = new Thread(Increment);
Thread thread2 = new Thread(Increment);
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
Console.WriteLine($"Counter: {counter}");
}
}
上述代码中,我们创建了两个线程,它们会并发地递增一个共享的计数器变量 counter
。为了确保线程安全,我们使用了一个锁对象 (lockObject
) 来保护共享资源的访问。
相比之下,单线程编程则更加简单,不需要考虑线程同步和竞态条件等问题。但是,在某些情况下,单线程可能无法满足需求或者效率要求。
通过深入理解 C# 消息、队列、多线程和单线程的相关概念,并结合实际代码示例,你应该能够更好地理解并应用这些概念来编写高效的并发程序。