我有一个 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/