不论什么编程语言,生产-消费模型都是有需求的,虽然.net本身有不少相关的类来支持这些模型,但是若是不复杂的问题重复造轮子未尝不可,毕竟有时候运行效率很重要,为了实现简单功能用已有的系统类会拖慢整个系统的速度(比如c#有关sql的类的许多方法,执行速度真的不能忍,比如执行事务操作跟我自己拼接查询字符串,数据量大的时候执行速度差距甚至能到两个量级),我通常都是在快速开发的时候使用自己定义的方法包装系统大类的功能,后期优化的时候再看情况去手动实现或者优化那些功能,而不是“嗯,系统提供了这个功能,我不需要实现了”,这样是永远没有办法成为大牛的LZ的问题可能就是一个线程需要实时读入数据,而另一个线程消费数据,实际上这个问题不是什么线程的问题,就是一个环形缓冲低于4.0可以用 Queue mySyncdQ = Queue.Synchronized( new Queue()); 大等于4.0可以用 var queue = new ConcurrentQueue<CustomerType>(); 这两个都是线程安全的fifo缓冲,具体用法百度
在错误的前提下,是不可能得到正确的结论的B线程只是读取数据,并没有 lock 的必要
Task.Run(()=>{
call(x);
});
.......甚至都可以,这类代码在 .net 中又不下10种不同写法,但是至少一点是一致的,就是直接了当。线程池本身就是队列管理,而且队列只是极其底层的一点概念(线程池有本质的高级功能)。那么传入的参数对象 x 自然地被编排到任务中,并且自然地以并发、异步形式去调用 call 方法。并且线程池是并发多线程调度的机制。用不着你自己发明什么“生产者、消费者、队列”,而且重点在于更多的必要并发多线程异步编程知识。那么纠结于“2个线程,一个 Array”这明显就是推着赶着马车进城、在.net 上学习写20年前的java代码了。
不论什么编程语言,生产-消费模型都是有需求的,虽然.net本身有不少相关的类来支持这些模型,但是若是不复杂的问题重复造轮子未尝不可,毕竟有时候运行效率很重要,为了实现简单功能用已有的系统类会拖慢整个系统的速度(比如c#有关sql的类的许多方法,执行速度真的不能忍,比如执行事务操作跟我自己拼接查询字符串,数据量大的时候执行速度差距甚至能到两个量级),我通常都是在快速开发的时候使用自己定义的方法包装系统大类的功能,后期优化的时候再看情况去手动实现或者优化那些功能,而不是“嗯,系统提供了这个功能,我不需要实现了”,这样是永远没有办法成为大牛的LZ的问题可能就是一个线程需要实时读入数据,而另一个线程消费数据,实际上这个问题不是什么线程的问题,就是一个环形缓冲低于4.0可以用
Queue mySyncdQ = Queue.Synchronized( new Queue());
大等于4.0可以用
var queue = new ConcurrentQueue<CustomerType>();
这两个都是线程安全的fifo缓冲,具体用法百度