2010-05-28 65 views
2

假设我们正在构建一些抓取用户设置(他想要执行呼叫的服务器,用户和密码)的公共服务,登录到该服务器以及做一些处理...在短时间内运行一次1000次的方法

  • 过程大约需要15秒才能完成
  • 每个用户都有不同的设置(服务器/用户/密码),因此过程中需要对每一个
运行

如果1000个用户告诉系统运行在1:00 PM

我怎么能保证,该方法是在接下来的15分钟处理的方法是什么?

什么应该是正确的方法来解决这个小问题?

我在想我需要异步执行某些操作,并行处理可能会加快速度,可能会限制进程,可能每30秒执行100次调用?

我从来没有像这样,很想得到的想法和未来的问题只花100个小时的工作,并认识到我采取了错误的道路:(

谢谢您的反馈意见。


添加

唯一需要考虑的是这应该是100%的网络解决方案。

回答

1

如果对您的方法的一次调用不影响另一个方法调用的结果(这似乎是这里的情况),并行编程似乎是要走的路。

考虑的不是在asp.net应用程序直接处理这个,而是放置在一个队列这样的要求,并具有另一个进程(Windows服务可能是一个很好的候选这里)拉项目从队列中进行处理。 Windows服务可以有多个线程,并且可以一次从队列中拉出尽可能多的项目,因为正在处理可用的线程。通过适当的排队机制,如果需要达到性能目标,Windows服务可以在单独的硬件上运行。

您可以让原始网页查询结果,例如, Ajax提供用户反馈,如果这是一个要求。

UPDATE:

微软recommended a pattern对于可在托管环境中使用长时间运行的任务。

+0

没有要求,因为这是用于自动化解决方案,但是您告诉我要运行Windows服务,所以我不能只在Web服务器(托管)中执行此操作,对吧? :-( – balexandre 2010-05-28 16:59:44

+0

@balexandre:更新了我的回复,其中包含一个Microsoft推荐的模式,该模式可以在托管环境中工作,与我的建议非常相似,不同之处在于您使用单独的Web服务而不是Windows服务,运行过程。 – 2010-05-28 18:13:28

1

那么,1000 * 15秒是超过4小时,所以你只能在15分钟的时间内完成整个任务,如果你并行的批次。

我会设置一个队列并有足够数量的线程或进程从该队列中拉出。

您可以使用Queue<T>或带有数据库表或MSMQ的进程外进程定义进程内队列。

如果您不想编写多线程代码,那么您可以在不同的机器上运行一堆不同的进程,这些进程都从同一个队列中提取。

控制台应用程序可以做到这一点,但Windows服务绝对也是一种选择。