首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

线程操作动态数组解决方法

2012-09-09 
线程操作动态数组C# codeprivate ListModel models new ListModel()public void updateModel(model

线程操作动态数组

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;            }        } 

热点排行