脚本在C#,SQL 2008中下载数千个文件的最佳方法

时间:2010-03-02 13:17:48

标签: c# sql

我有一个脚本,它运行数据库表并为每一行下载一个文件,添加到内存中的结果表,然后在完成后将所有结果批量上传回数据库。

我遇到的问题是可能有数千个文件需要下载,脚本可能会超时或出错。

有没有更好的方法,可能涉及线程或异步调用?

6 个答案:

答案 0 :(得分:2)

线程似乎是要走的路.. 你应该有一个或多个从db读取行的线程(如果你想要很多线程,你应该相应地对读取进行分区)并将它们放在某种并发集合中(.net 4内置集合,或者内置/下载自定义的)。 那么你应该有一个线程集合谁将从该列表中获取项目并获取文件,如果超时,他应该将任务放回集合中。

这是一种基本的生产者 - 消费者线程模式。 你可以在google中轻松找到很多例子。

答案 1 :(得分:2)

如果超时的原因是要下载的文件数,我建议使用ThreadPool进行异步调用。

首先,使用ThreadPool.SetMaxThreads设置最大并行线程数。然后,您可以使用ThreadPool.QueueUserWorkItem对任务进行排队。这种做法将保证最大并发线程数。超过最大数量的所有数据都将等到池中的一个线程完成。

答案 2 :(得分:1)

也许这可能是云应用程序的一个很好的候选者。带宽,排队等待异步处理,及时扩展?

答案 3 :(得分:0)

每次下载操作后是否可以将结果保留回数据库?这样你就可以比较两个表的行,以便在出现某种超时或错误的情况下从中断的位置进行选择。线程可能使其更快,但它不会解决您自己询问的问题。

答案 4 :(得分:0)

如果您有足够的时间运行脚本(每天午夜运行一次等),那么最简单的解决方案是每次下载X时都会持久保存到数据库。

答案 5 :(得分:0)

我不会在脚本中执行此类操作。相反,我有一些类型的程序,可能作为Windows服务运行,它实际上将执行下载所有这些文件和更新相关记录的工作。

如果它只应该在用户单击按钮时运行,那么我将为服务监视器提供一个表来执行命令。一旦它检测到该命令,然后启动并开始。

这里不确定模式名称,但它基本上就像一个作业排队系统。