【发布时间】: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 以限制对列表的访问,以便在任何时候只有一个线程使用它。这可能会更慢,但会保持列表的完整性