直接把代码贴出来吧,我的设想是用函数Read()显示list中每一个对象时,都把list给锁住,不允许修改。但是现在看上去好像不行,一运行就出现提示为“Collection was modified; enumeration operation may not execute.”的异常。即使用lock(list)代替Monitor.Enter(list)也一样。虽然可以用try……catch把foreach()扩起来,但是这样违背了设计的初衷:只要在遍历list,无论Add还是Reomve都得等遍历完才能执行。
请问用Monitor为什么不能把list给锁住不允许其他线程访问呢?如果要达到我的目的,代码应该如何改写呢?using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace Test
{
    class Program
    {
        List<String> list;
        
        public void Read()
        {
            while (true)
            {
                Monitor.Enter(list);
                foreach (String s in list)
                {
                    Console.WriteLine(s);
                }                Monitor.Exit(list);
            }
        }        public void AddAndRemove()
        {            String s="Add and Remove";            while (true)
            {
                list.Add(s);
                list.Remove(s);
            }
        }        public Program()
        {
            list=  new List<string>();
            list.Add("String No 1");
            list.Add("String No 2");
            list.Add("String No 3");
            list.Add("String No 4");
            list.Add("String No 5");
            list.Add("String No 6");            new Thread(new ThreadStart(AddAndRemove)).Start();            Read();        }        static void Main(string[] args)
        {            Program p = new Program();        }
    }
}

解决方案 »

  1.   

    Monitor.Enter(list);
                    list.Add(s);
                    list.Remove(s);
                    Monitor.Exit(list);
      

  2.   

    这样还是不行。感觉Monitor好像对.Net中的集合类型失效。
      

  3.   

    你需要对AddAndRemove方法加Monitor.Enter(list)和Monitor.Exit(lipublic void AddAndRemove()
            {            String s="Add and Remove";            while (true)
                {
                    Monitor.Enter(list);
                    list.Add(s);
                    list.Remove(s);
                    Monitor.Exit(list);
                }
            }
      

  4.   

    参看
    http://blog.csdn.net/knight94/archive/2006/03/22/632512.aspx方法都是一样的。
      

  5.   

    两个都加上Monitor肯定是可以的!!!不然MICROSOFT要哭了。