ASP.NET线程 - 我可以使用异步方法还是使用线程?

时间:2010-08-16 15:55:14

标签: c# asp.net multithreading asp.net-2.0

我的环境 - C#3.5和ASP.NET 4.0和VS 2010

道歉 - 对于与线程和异步方法相关的一些概念有点新鲜。

我的情况是:

  1. 我的网站会定期向外部网站提供一些GET / POSTS并收集一些数据
  2. 此数据将缓存在中央缓存中
  3. 定期操作将在大约5分钟内发生一次,并且会在我的网站上注册的每个新成员发生。查询会员将根据某些条件停止
  4. 用户不需要登录这些定期查询 - 他们在网站上注册,然后关闭我的异步代码 - 它会一直24/7工作并通过电子邮件向用户发送消息,具体取决于某些触发器条件。所以基本上所有这些都应该在后台发生,无论用户是否明确登录。
  5. 加载预期 - 我预计每天会有大约100个正在运行的成员(占新成员+旧成员离开/停止)。

    方程式约为每天100位访问者x每次提取4次提取x 12次提取/小时x 8小时/天

    在我看来 - 我每天运行100个线程,每个'线程'在5分钟内唤醒一次并做一些事情。线程将与静态中央缓存交互,该缓存在所有这些缓存中共享。

    我已经阅读了一些关于ThreadPools,AsyncPage等的讨论 - 这些都是一个新领域。在我的情景中,你会建议什么?这样做的最佳方法是什么,这样才有效?

    在你的回复中,如果你提到使用的特定类/方法/链接,我将不胜感激,所以我可以追逐这个。非常感谢!

3 个答案:

答案 0 :(得分:3)

您将无法使用ASP.net这样做,您将无法保持“线程”以任何级别的可靠性运行。 IIS可以决定在任何时间点重新启动应用程序池(I.E.整个过程)。真正需要的是某种运行并发出请求的Windows服务。您可以使用HttpWebRequest.BeginGetResponse方法拨打电话。当响应回来时,这将激活相关代表,.net将管理线程。

答案 1 :(得分:1)

同意Ben,我不会在IIS中使用ASP.NET中的线程。这与在桌面应用程序中使用它不同。

如果您要使用某种轮询或定时操作,我建议使用处理程序(.ashx)或asp.net页面(aspx),它可以接收您想要在后台运行的请求并返回XML或JSON作为响应。然后,您可以在页面中设置一些javascript来对该URI执行AJAX请求并获取所需的任何数据。该处理程序可以执行您需要的服务器端操作。这将允许您在必要时运行后台进程并为您的用户更新前端,并将利用现有的IIS线程池,您可以对其进行扩展以适应您正在获得的流量。

所以,例如

ajaxRequest.ashx :处理“后台”请求,获取http POST / GET参数。

myPage.aspx :您的用户界面

someScript.js :javascript文件,其函数在发生某些操作或间隔时从myPage.aspx(或任何其他页面)调用ajaxRequest.ashx。

jQuery.js :无需自己编写所有AJAX代码或事件处理程序:)

答案 2 :(得分:0)

您需要创建一个单独的Windows服务(或使用Windows调度程序运行的控制台应用程序)来轮询远程服务器。

如果您需要根据用户与您网站的互动来触发请求,最好的方法是使用您的服务监控的某种排队系统(例如MSMQ)。