问:线程B怎么做? 因为array肯定是在一直增长的
我知道线程B应该要用到lock这个关键字。
 大神能否例举个demo演示下 

解决方案 »

  1.   

    线程A、线程B 都要 lock,lock array 就行了。
      

  2.   

    BlockingCollection了解下。
      

  3.   

    数组一旦创建,其规模就是固定的,不可变化的,所以 array肯定是在一直增长的 是不成立的
    在错误的前提下,是不可能得到正确的结论的B线程只是读取数据,并没有 lock 的必要
      

  4.   

    20 年前的 java 书籍中容易被最垃圾的说法借用的模式之一是叫做“生产者-消费者”模式的东西,有的人说“我启动两个线程,一个生产、一个消费、中间弄一个队列(或者如你所说是什么Array)”。20年之后,至少在 .net 系统中,完全不是这样设计并发异步程序的。我们写var x = 1;
    Task.Run(()=>{
        call(x);
    });
    .......甚至都可以,这类代码在 .net 中又不下10种不同写法,但是至少一点是一致的,就是直接了当。线程池本身就是队列管理,而且队列只是极其底层的一点概念(线程池有本质的高级功能)。那么传入的参数对象 x 自然地被编排到任务中,并且自然地以并发、异步形式去调用 call 方法。并且线程池是并发多线程调度的机制。用不着你自己发明什么“生产者、消费者、队列”,而且重点在于更多的必要并发多线程异步编程知识。那么纠结于“2个线程,一个 Array”这明显就是推着赶着马车进城、在.net 上学习写20年前的java代码了。
      

  5.   


    不论什么编程语言,生产-消费模型都是有需求的,虽然.net本身有不少相关的类来支持这些模型,但是若是不复杂的问题重复造轮子未尝不可,毕竟有时候运行效率很重要,为了实现简单功能用已有的系统类会拖慢整个系统的速度(比如c#有关sql的类的许多方法,执行速度真的不能忍,比如执行事务操作跟我自己拼接查询字符串,数据量大的时候执行速度差距甚至能到两个量级),我通常都是在快速开发的时候使用自己定义的方法包装系统大类的功能,后期优化的时候再看情况去手动实现或者优化那些功能,而不是“嗯,系统提供了这个功能,我不需要实现了”,这样是永远没有办法成为大牛的LZ的问题可能就是一个线程需要实时读入数据,而另一个线程消费数据,实际上这个问题不是什么线程的问题,就是一个环形缓冲低于4.0可以用
    Queue mySyncdQ = Queue.Synchronized( new Queue());
    大等于4.0可以用
    var queue = new ConcurrentQueue<CustomerType>();
    这两个都是线程安全的fifo缓冲,具体用法百度
      

  6.   

    我觉得专业大神说的对,直接用Task就好,.net中已经做好了一些线程调度的方案,如果你不是对线程特别熟悉那你只需要知道其用法就行。
      

  7.   

    弄两个定时任务,简单点用Time就行,一个产生数据,一个计算数据。