定义了一个 List<string> Buffer
thread1:每隔2秒向Buffer更新数据;
thread2: Buffer每次更新数据后,对其内数据进行处理 process(Buffer)可是每次运行都会抛出异常提示thread1将Buffer的count修改
小弟我已经试过lock(this){process(Buffer)} 、lock(((IList)Buffer).SyncRoot)、System.Threading.Monitor.Enter(Buffer)
可是都锁不住Buffer,有什么办法能解决这个问题呢??

解决方案 »

  1.   

    也没解决。。使用Hashtable代替了。。
      

  2.   

    Could be something wrong in your program.
    List<> itself can be synchronized:using System;
    using System.Threading;
    using System.Collections.Generic;namespace ConsoleApplication1
    {
        class Program
        {
            List<string> Buffer = new List<string>();
            void ThreadAdder(object state)
            {
                for (int i = 0; ; i++)
                {
                    lock (Buffer)                        //<---
                    {
                        Buffer.Add(i.ToString());
                    }
                    Thread.Sleep(1000);
                }
            }
            void ThreadProcessor(object state)
            {
                while (true)
                {
                    lock (Buffer)                       //<---
                    {
                        for (int i = 0; i < Buffer.Count; i++)
                        {
                            if (Buffer[i].Length < 10) Buffer[i] = Buffer[i] + ".";
                            Console.WriteLine(Buffer[i]);
                        }
                        Console.WriteLine();
                    }
                    Thread.Sleep(1000);
                }
            }
            public void Run()
            {
                ThreadPool.QueueUserWorkItem(ThreadAdder);
                ThreadPool.QueueUserWorkItem(ThreadProcessor);
            }        static void Main(string[] args)
            {
                new Program().Run();
                Console.ReadLine();
            }
        }
    }
      

  3.   

    不会出错啊,我写的代码如下:
    List<string> _buffer;
            ManualResetEvent _event;
            readonly object _lockObj = new object();
            private void btn_buffer_Click(object sender, EventArgs e)
            {
                _buffer = new List<string>();
                _event = new ManualResetEvent(false);
                new Thread(new ThreadStart(update)).Start();
                new Thread(new ThreadStart(process)).Start();
            }        private void update()
            {
                while (true)
                {
                    lock (_lockObj)
                    {
                        _buffer.Add(new Random().Next().ToString());
                    }
                    _event.Set();
                    Thread.Sleep(2000);
                }
            }        private void process()
            {
                while (true)
                {
                    while (_event.WaitOne())
                    {
                        lock (_lockObj)
                        {
                            for (int i = 0; i < _buffer.Count; i++)                        
                                _buffer[i] = (int.Parse(_buffer[i]) + 1).ToString();                        
                        }
                    }
                }            
            }
      

  4.   

    removing elements has no problem:        void ThreadProcessor(object state)
            {
                while (true)
                {
                    lock (Buffer)
                    {
                        for (int i = 0; i < Buffer.Count; i++)
                        {
                            if (Buffer[i].Length < 10)
                            {
                                Buffer[i] = Buffer[i] + ".";
                                Console.WriteLine(Buffer[i]);
                            }
                            else Buffer.RemoveAt(i);                // remove an element
                        }
                        Console.WriteLine();
                    }
                    Thread.Sleep(1000);
                }
            }
      

  5.   

    运行了这样也不会出错哦
            private void btn_buffer_Click(object sender, EventArgs e)
            {
                _buffer = new List<string>();
                new Thread(new ThreadStart(update)).Start();
                new Thread(new ThreadStart(process)).Start();        }
            private void update()
            {
                while (true)
                {
                    lock (_buffer)
                    {
                        _buffer.Add(new Random().Next().ToString());
                    }
                    Thread.Sleep(2000);
                }
            }        private void process()
            {
                while (true)
                {
                    lock (_buffer)
                    {
                        for (int i = 0; i < _buffer.Count; i++)
                            _buffer[i] = (int.Parse(_buffer[i]) + 1).ToString();
                    }
                }
            }
      

  6.   

    http://www.cnblogs.com/ztotem/archive/2008/04/24/1169283.html
    不知对你有没有帮助??