直接把代码贴出来吧,我的设想是用函数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(); }
}
}
请问用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(); }
}
}
list.Add(s);
list.Remove(s);
Monitor.Exit(list);
{ String s="Add and Remove"; while (true)
{
Monitor.Enter(list);
list.Add(s);
list.Remove(s);
Monitor.Exit(list);
}
}
http://blog.csdn.net/knight94/archive/2006/03/22/632512.aspx方法都是一样的。