日期:2014-05-17  浏览次数:20700 次

线程操作动态数组
C# code
        
        private List<Model> models = new List<Model>();

        public void updateModel(model)
        {
            models.Add(model);
            if (isOpen)
            {
                Thread thread = new Thread(UpdateModels);
                thread.Start();
                isOpen = false;
            }
        }

        private void UpdateModels()
        {
            while (flag)
            {
                if (models != null)
                {
                    if (models.Count > 50)
                    {
                        UpdateModelsStatus(models);
                        models.RemoveRange(0, 49);
                        isUpdate = true;
                    }
                    else
                    {
                        if (isUpdate && models.Count > 0)
                        {
                            UpdateModelsStatus(models);
                            models.RemoveRange(0, models.Count - 1);
                            isUpdate = false;
                        }
                    }
                }
            }
        }

updateModel方法会一直被调用,所以MODELS数组的值会越来越多,因为UpdateModelsStatus方法会执行一段时间,所以我加了线程,不然会阻塞的,线程里,如果MODELS的COUNT每大于50就会更新一次,这样就可以吧所有传来的MODEL都更新掉,但是如果小于50的时候,models.RemoveRange(0, models.Count - 1);如果在这个地方MODELS有添加新的MODEL,那么它的COUNT和传入方法的MODELS就会不一样(UpdateModelsStatus(models);),这样就会少更新一个或多个,这个该怎么解决?求高手
注:原来UpdateModelsStatus的方法传入的是一个MODEL,因为updateModel执行太快,但是UpdateModelsStatus执行很慢,所以加了数组来缓冲下。

------解决方案--------------------
用队列
开两个线程
一个写
一个读,有数据就读,读一个少一个,不管是不是够50个
不行吗?



------解决方案--------------------
线程的经典案例 生产者消费者,看看吧
------解决方案--------------------
用队列吧,主线程入队,再开一个线程处理队列。
注意进出队列的时候lock一下
------解决方案--------------------
这样就行了
C# code

        public void updateModel(Model model)
        {
            models.Add(model);
            if (isOpen) {
                if (models.Count > 50) {
                    Thread thread = new Thread(mds => {
                        UpdateModelsStatus(mds as List<Model>);
                    });
                    thread.Start(new List<Model>(models));
                    models.Clear();
                }
                isOpen = false;
            }
        }