C#异步案例一则
生产者和消费者队列, 生产者有多个, 消费者也有多个, 生产到消费需要异步.
[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