所以这是我的问题:
我有一个静态的对象列表,用于存储所有正在上传的文件。
private static List<Upload> vidUploadList = new List<Upload>();
要维护列表,应从列表中删除任何失败的上传。我的问题是:如果用户更改列表,列表中的项目索引将更改。是否有可能另一个用户使用循环命令进入列表的一半并且列表会更改?如果说,列表中的项[3]被使用,然后删除了之前的对象(将位置更改为[2]),代码是否仍会运行?
是否有可能在任何用户使用它时锁定列表,然后直接释放锁定,确保一次只有一个会话正在访问列表?我听说监听班可以帮助我。
答案 0 :(得分:1)
代码是否仍会运行?
不,InvalidOperationException
“集合已被修改;枚举操作可能无法执行”将被抛出
你可以用这个简单的代码来实际尝试
List<int> test = new List<int>(){ 1, 2, 3, 4, 5};
foreach(int i in test)
test.Remove(i); //Exception
如果您真的希望允许多个用户对其进行修改,请考虑使用ConcurrentCollection
,例如ConcurrentBag
答案 1 :(得分:-1)
当我在Visual Studio 2013中使用C#时,编译器会抱怨如果使用foreach
循环遍历列表时显然已更改列表。但是如果你找到列表的大小并使用for loop
循环它,我不认为编译会失败。但它仍然不是一种好的做法,因为执行可能不稳定。以下是lock your list的方法链接。