using System; using System.Collections.Concurrent; using System.Threading; namespace Managers { /// /// 双缓冲静态类,用于逻辑计算线程与主线程之间的数据同步。 /// /// 要同步的数据类型。 public static class DoubleBuffer { /// /// 当前用于写入的缓冲区。 /// private static T _writeBuffer; /// /// 当前用于读取的缓冲区。 /// private static T _readBuffer; /// /// 用于同步缓冲区交换的锁对象。 /// private static readonly object _lock = new object(); /// /// 初始化双缓冲类。 /// /// 初始值,用于初始化两个缓冲区。 public static void Initialize(T initialValue) { _writeBuffer = initialValue; _readBuffer = initialValue; } /// /// 写入数据到当前写缓冲区。 /// /// 要写入的数据。 public static void Write(T data) { lock (_lock) { _writeBuffer = data; // 将数据写入写缓冲区 } } /// /// 交换读写缓冲区,使主线程可以读取最新的数据。 /// public static void SwapBuffers() { lock (_lock) { // 交换读写缓冲区 T temp = _readBuffer; _readBuffer = _writeBuffer; _writeBuffer = temp; } } /// /// 从当前读缓冲区读取数据。 /// /// 当前读缓冲区中的数据。 public static T Read() { lock (_lock) { return _readBuffer; // 返回读缓冲区中的数据 } } } /// /// 网络消息缓冲区类,用于在网络线程和主线程之间进行线程安全的消息传递。 /// public static class NetworkMessageBuffer { /// /// 缓冲区的最大消息数量。 /// private static readonly int MaxMessageCount; /// /// 存储消息的线程安全队列。 /// private static readonly ConcurrentQueue MessageQueue; /// /// 用于控制缓冲区是否已满的信号量。 /// private static readonly SemaphoreSlim BufferSemaphore; /// /// 初始化网络消息缓冲区类。 /// static NetworkMessageBuffer() { MaxMessageCount = 100; MessageQueue = new ConcurrentQueue(); BufferSemaphore = new SemaphoreSlim(MaxMessageCount, MaxMessageCount); } /// /// 向缓冲区添加一条消息。 /// 如果缓冲区已满,则等待直到有空间可用。 /// /// 要添加的消息内容。 public static async void AddMessageAsync(string message) { // 等待缓冲区有可用空间 await BufferSemaphore.WaitAsync(); try { // 将消息添加到队列中 MessageQueue.Enqueue(message); } catch (Exception ex) { Console.WriteLine($"AddMessageAsync Error: {ex.Message}"); } } /// /// 从缓冲区中读取一条消息。 /// 如果缓冲区为空,则返回 null。 /// /// 缓冲区中的第一条消息,如果缓冲区为空则返回 null。 public static string ReadMessage() { if (MessageQueue.TryDequeue(out string message)) { // 释放一个缓冲区空间 BufferSemaphore.Release(); return message; } return null; } /// /// 获取当前缓冲区中的消息数量。 /// /// 当前缓冲区中的消息数量。 public static int GetMessageCount() { return MessageQueue.Count; } /// /// 清空缓冲区中的所有消息。 /// public static void ClearBuffer() { while (MessageQueue.TryDequeue(out _)) { } } } }