生产者和消费者队列, 生产者有多个, 消费者也有多个, 生产到消费需要异步.

下面用一个Asp.NetCore Web-API项目来模拟

[Route("api/[controller]/[action]")] public class FooController : Control {     IMessageQueue _mq;     public FooController(IMessageQueue mq)     {         _mq = mq;     }      [HttpGet]     public string Get()     {         string str = _mq.ReadOne<string>();         return str;     }      [HttpGet]     public void Set(string v)     {         _mq.WriteOne(v);     } }  public interface IMessageQueue {     T ReadOne<T>();     void WriteOne<T>(T value); }  public class MessageQueue: IMessageQueue {     private object _value;      public T ReadOne<T>()     {         return (T)_value;     }      public void WriteOne<T>(T value)     {         _value = value;      } }
复制代码

接着在StartUp中把IMessageQueue给注入了.

services.AddSingleton<IMessageQueue, MessageQueue>();

运行后, 先调用/api/foo/set/?v=xxx, 再调用/api/foo/get/

可以看到成功返回了xxx

第二步, value字段改为队列:#

使set进去的值不会被下一个覆盖, get取队列最前的值

为了线程安全, 这里使用了ConcurrentQueue<T>

代码如下:

复制代码
public class MessageQueue: IMessageQueue {     private readonly ConcurrentQueue<object> _queue = new ConcurrentQueue<object>();      public T ReadOne<T>()     {         _queue.TryDequeue(out object