在我们的应用程序中,我们需要通过 API 为我的应用程序的用户从 paypal 导入交易数据并将其存储在数据库中。我有数千名(现在大约 5000 名)用户,而且还在日益增加。
此应用程序是一个 .net windows 服务。
这会按小时为所有用户导入数据。目前我们正在一个接一个地为用户导入数据,但有时一个用户数据可能非常大,需要大约 5 小时才能获取他的全部数据,因此我们会阻止其他用户,直到该用户数据导入完成。这对所有其他用户的每小时导入完全没有折腾。
为了避免这种情况,我们考虑为每个用户导入创建线程,并使用 Windows 服务每小时运行一次。在这种情况下,我们需要考虑任何时间点的带宽,因为所有线程都将同时启动。这是一个问题吗?
现在,我想知道我们的新实现方式是否正确?另外我想知道它通常是如何完成的?如果有人遇到过这种功能,请告诉我们它是如何完成的。
如果我的问题不够清楚,请告诉我,我会提供更多信息。
编辑:如果我从一个 IP 向 Paypal 发送这么多请求,它如何处理?知道它是否限制了每个 IP 的请求吗?
更新:感谢所有的建议和反馈。
我想到了使用 jgauffin 的解决方案,因为它是 ThreadPool 的完美模仿。但是在这里我需要一些更多的特性,比如动态改变线程限制和回调方法的递归调用。
经过大量研究和分析线程池,我决定使用 SmartThreadPool它基于线程池逻辑制作,但具有更多功能。它非常好,完全符合我的目的。
最佳答案
不要为每个用户使用一个线程。为每个用户在线程池中放置一个 WORK ITEM。通过这种方式,您可以两全其美 - 无需 5000 个线程的内存开销,以及更多的负载控制,因为您可以确定 ThreadPool 使用多少线程来处理工作项。
关于c# - 使用线程通过 API 为数千用户导入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3707787/