c# - 如何加快在 ASP.NET 中调用命令行工具的循环?

标签 c# asp.net loops command-line

我有一个 ASP.NET 页面,可以(快速)获取游戏服务器 IP 地址列表,并循环运行针对它们的命令行工具以获取特殊的游戏服务器信息。我必须使用命令行工具,因为我不知道它是如何从机器获取信息的,而且我不想重新发明轮子。循环是缓慢的部分(惊喜)。每个命令行工具运行最多需要一秒钟,因此平均轮询大约 60 个 IP 地址,页面加载可能需要 30-60 秒才能呈现我需要的结果。

我明显的想法是“多线程那个东西!”好吧,我尝试过使用线程池,但如果一次有多个人访问该页面,最终会导致网站挂起。这一次只使用 4-5 个调用,最多 60 个调用,使其加载时间为 10 秒。所以它不仅卡在多个用户身上,而且还是太慢了。如果我能将它缩短到 3 秒以内,我会很高兴。

我应该提到这个页面是在共享主机环境中。在共享托管环境之外,我有一个很好的解决方案,但我不得不削减成本,现在我正努力让它在共享环境下工作。

还有希望吗?

最佳答案

您真的不应该“按需”轮询这些服务器。最好使用 ASP.NET 来显示服务器信息列表,并使用其他一些进程(如 Windows 服务或计划任务)每隔几分钟轮询一次服务器以生成该列表。总结一下:该服务将创建一个 XML 文件(例如),ASP.NET 会将其显示给用户。这样,查看页面的用户数量不会影响您尝试轮询服务器的次数。

更新:

你需要确保ping服务器的进程是单例的。具体来说,单例是一个只能存在单个实例的类。对于您的情况,用更一般的术语来说,您需要设置一个全局标志,表示“我当前正在 ping 服务器”,另一个全局日期时间值表示“我最后一次 ping 服务器是在 hh:mm:ss”——你可以使用 Application 字典来存储 bool 标志和日期时间。每次有人加载您的页面时,检查标志以查看它是否已经在对服务器执行 ping 操作。如果是,请不要这样做。如果旗帜说好,然后检查当前时间与你上次这样做的时间。如果少于 5 分钟,请不要这样做。所有这些都应该在后台线程中完成。此线程应更新 App_Data 中的 xml 文件。对您页面的所有请求都应立即呈现此数据。页面请求不应该阻塞。如果第一次调用时文件不存在,则返回“正在执行 ping,请在 5 分钟后重试”。关注?

在此处阅读有关 ASP.NET 应用程序状态字典的信息: http://msdn.microsoft.com/en-us/library/ie/ms178594.aspx

关于c# - 如何加快在 ASP.NET 中调用命令行工具的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8954242/

相关文章:

c# - 如何在 Mongodb 的聚合框架中编写日期范围查询?

c# - 具有非接口(interface)的构造函数参数的依赖注入(inject)

c# - 为什么我不能在 C# 代码文件中使用 Request.ServerVariables ["ALL_HTTP"]?

asp.net - Microsoft/Facebook 身份验证的高级功能在 Asp .Net Core RC1 上不可用

c - 循环内的 strcat() 与 sprintf()

c# - 上传到 FTP 的文件一旦到达目的地就会损坏

c# - 在 Visual Studio 或 SQL Server Management Studio 中连接到 Azure SQL 数据库需要执行哪些步骤?

c# - GAE Flexible 不使用 CORS 返回正确的响应 header

excel - 使用 VBA 循环遍历工作簿中的所有图表

r - 使用 lpsolve 在 R 中进行线性规划