我有一个脚本,它运行数据库表并为每一行下载一个文件,添加到内存中的结果表,然后在完成后将所有结果批量上传回数据库。
我遇到的问题是可能有数千个文件需要下载,脚本可能会超时或出错。
有没有更好的方法,可能涉及线程或异步调用?
答案 0 :(得分:2)
线程似乎是要走的路.. 你应该有一个或多个从db读取行的线程(如果你想要很多线程,你应该相应地对读取进行分区)并将它们放在某种并发集合中(.net 4内置集合,或者内置/下载自定义的)。 那么你应该有一个线程集合谁将从该列表中获取项目并获取文件,如果超时,他应该将任务放回集合中。
这是一种基本的生产者 - 消费者线程模式。 你可以在google中轻松找到很多例子。
答案 1 :(得分:2)
如果超时的原因是要下载的文件数,我建议使用ThreadPool
进行异步调用。
首先,使用ThreadPool.SetMaxThreads
设置最大并行线程数。然后,您可以使用ThreadPool.QueueUserWorkItem
对任务进行排队。这种做法将保证最大并发线程数。超过最大数量的所有数据都将等到池中的一个线程完成。
答案 2 :(得分:1)
也许这可能是云应用程序的一个很好的候选者。带宽,排队等待异步处理,及时扩展?
答案 3 :(得分:0)
每次下载操作后是否可以将结果保留回数据库?这样你就可以比较两个表的行,以便在出现某种超时或错误的情况下从中断的位置进行选择。线程可能使其更快,但它不会解决您自己询问的问题。
答案 4 :(得分:0)
如果您有足够的时间运行脚本(每天午夜运行一次等),那么最简单的解决方案是每次下载X时都会持久保存到数据库。
答案 5 :(得分:0)
我不会在脚本中执行此类操作。相反,我有一些类型的程序,可能作为Windows服务运行,它实际上将执行下载所有这些文件和更新相关记录的工作。
如果它只应该在用户单击按钮时运行,那么我将为服务监视器提供一个表来执行命令。一旦它检测到该命令,然后启动并开始。
这里不确定模式名称,但它基本上就像一个作业排队系统。