【问题标题】:C#/ASP.Net modifying lists... will this cause problems?C#/ASP.Net 修改列表...这会导致问题吗?
【发布时间】:2016-10-12 01:22:44
【问题描述】:

这是我的问题:

我有一个静态的对象列表,用于存储所有上传的文件。

private static List<Upload> vidUploadList = new List<Upload>();

为维护列表,应从列表中删除任何失败的上传。我的问题是:如果用户更改列表,列表中项目的索引将会改变。另一个用户是否有可能使用循环命令完成列表的一半并更改列表?如果说,列表中的项目 [3] 正在被使用,然后之前的对象被删除(将位置更改为 [2]),代码是否仍然运行?

是否可以在任何用户使用列表时锁定列表,然后立即释放锁定,确保一次只有一个会话访问列表?我听说监控类在这里可以帮助我。

【问题讨论】:

  • static 和 web 不能混合使用,除了全局项目。您可能不希望这是静态的,因为所有用户都将共享同一个集合。
  • 是的,如果您同时从列表中读取和写入,事情很快就会变得一团糟。您可以使用来自System.Concurrent.Collections 的集合,或者更好的是,放弃网络服务器中的所有状态并使用数据库。
  • 请注意,如果您的 ApplicationPool 将被释放,列表中的所有 Informationen 都将消失
  • 我尽量保持简单。该应用程序用于将 20GB 以上的大文件上传到数据库。我必须始终打开 SqlFilestream,否则会创建较小的文件并淹没我的数据库文件流。该列表基本上是所有打开连接的 SqlFilestream 连接,然后用于插入每个小块信息。由于可能有数百个用户,我需要一个列表。
  • 所以,目前我正在查看 System.Threading.Monitor 以限制对列表的访问,以便在任何时候只有一个线程使用它。这可能会更慢,但会保持列表的完整性

标签: c# asp.net


【解决方案1】:

代码还能运行吗?

不,InvalidOperationException“集合已修改;枚举操作可能无法执行”将被抛出

你可以用这个简单的代码实际尝试一下

List<int> test = new List<int>(){ 1, 2, 3, 4, 5};
foreach(int i in test)
    test.Remove(i); //Exception

如果您确实希望允许多个用户对其进行编辑,请考虑使用 ConcurrentCollection,例如 ConcurrentBag

【讨论】:

    【解决方案2】:

    当我在 Visual Studio 2013 中使用 C# 时,如果在使用 foreach 循环遍历列表时很明显列表正在被更改,编译器会抱怨。但是,如果您找到列表的大小并使用for loop 循环遍历它,我认为编译不会失败。但这仍然不是一个好的做法,因为执行可能不稳定。这是一个链接到如何lock your list

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多