我有一个 FileShare 爬虫(获取权限并将它们放在某个地方以供以后审核)。目前它正在启动多个线程来爬取同一个文件夹(以加快进程)。
在 C# 中,每个SqlConnection
对象都有自己的SqlTransaction
,由SqlConnection.BeginTransaction()
调用发起。
这是当前解决方案的伪代码:
- 获取文件夹列表
- 对于每个文件夹,获取子文件夹列表
- 为每个子文件夹启动一个线程来收集文件共享
- 每个线程将收集到的数据保存到数据库
- 在数据库上运行审计报告
当其中一个子文件夹线程失败时,就会出现问题。我们最终会扫描“无法轻易检测到”的部分文件夹。主要原因是每个线程都在单独的连接上运行。
我想让每个文件夹在同一个事务中提交,而不是扫描不完整(当前情况,当某些线程失败时)。没有实现交易概念,但我正在评估选项。
根据这个答案的评论,生产者/消费者队列将是一个选项,但不幸的是内存是一个限制(由于启动线程的数量)。如果生产者/消费者空间被提交到磁盘以克服 RAM 限制,则执行时间将增加(由于磁盘 I/O 与内存 I/O 相比非常有限)。我想我被记忆/时间妥协所困扰。还有其他建议吗?