2012-01-21 10 views
1

私は、ゲームサーバーのIPアドレスの一覧を取得して(すぐに)ASP.NETのページをループして、特別なゲームサーバー情報を取得するためのコマンドラインツールを実行します。私はコマンドラインツールを使用する必要があります。なぜなら、マシンから情報を取得する方法がわからないからです。ホイールを再構成したくないからです。ルーピングは遅い部分です(驚きの驚き)。各コマンドラインツールの実行には最大2秒かかるので、平均で約60個のIPアドレスがポーリングされ、ページロードには30〜60秒かかることがあります。ASP.NETでコマンドラインツールを呼び出すループを高速化するにはどうすればよいですか?

明らかに私の考えは「マルチスレッドそのこと!さて、私はスレッドプールを使ってみましたが、一度に複数の人がページにアクセスすると、ぶら下がったWebサイトで終わりました。これは60までの時間に4〜5通話しか使用していなかったため、10秒間の読み込み時間になりました。だから、複数のユーザーとハングアップしただけでなく、まだ遅すぎました。私が3秒以下にすることができれば嬉しいです。

このページは共有ホスティング環境にある必要があります。私は共有ホスティング環境の外で前に素晴らしいソリューションを持っていましたが、コストを削減しなければならなかったので、今すぐ共有するようにしています。

希望がありますか?

+0

ツールやOSに何らかの制限がある場合を除き、parellizeする必要があります。ツールは正確に何をしていますか? – driis

+0

ツールは何ですか?あなたはasp.netから見つけることができない特別なサーバー情報は何ですか? – Aristos

+0

ツールは、実行中のゲームから特定のゲーム情報を取得します。 .NETが提供できるものではありません。 – Rutt

答えて

3

「オンデマンドで」これらのサーバーを実際にポーリングするべきではありません。 ASP.NETを使用してサーバー情報のリストを表示し、Windowsサービスやスケジュールされたタスクなどの他のプロセスを使用して、数分ごとにサーバーをポーリングしてリストを生成する方がよいでしょう。要約すると、サービスはXMLファイルを作成し、ASP.NETはそれをユーザーに表示します。この方法では、ページを表示するユーザーの数は、サーバーをポーリングしようとする時間に影響しません。

更新

あなたはピングサーバがシングルトンであるプロセスを確保する必要があります。具体的には、シングルトンは、単一のインスタンスのみが存在するクラスです。より一般的なケースでは、「私は現在サーバにpingしています」というグローバルフラグを設定し、「サーバにpingを行った最後の時間はhh:mm:ssだった」という別のグローバル日時の値を設定する必要がありますアプリケーション辞書を使用してブール値フラグと日時を格納することができます。誰かがあなたのページを読み込むたびに、フラグをチェックして、すでにサーバーにpingを行っているかどうかを確認します。もしそうなら、それをしないでください。フラグがOKと表示されている場合は、最後に行った時と現在の時刻を確認します。それが5分未満の場合は、しないでください。これらはすべてバックグラウンドスレッドで実行する必要があります。このスレッドは、App_DataのXMLファイルを更新する必要があります。ページへのすべてのリクエストは、このデータをすぐに表示する必要があります。ページリクエストは決してブロックするべきではありません。最初の呼び出しでファイルが存在しない場合は、「ping in progress」を返し、5分後にもう一度試してください。フォローですか?

ここではASP.NETアプリケーションの状態辞書についての記事を読む: http://msdn.microsoft.com/en-us/library/ie/ms178594.aspx

+0

はい、私は同意しますが、投稿に記載されているように、私は共有ホスティング環境でこれを動作させようとしています。この環境では、カスタムスケジュールされた.exeは実行できません。以前はDBへのWindowsサービスをうまく使っていましたが、コストを削減して共有ホスティングに移行する必要がありました。その間、私はデータをキャッシュしているので、実際にはサーバ上ではほとんどクエリがありません。 – Rutt

+0

私はこれを解決するとは考えていない他の予算に優しい選択肢があることを希望しているので、私はSOに投稿しました。私が考えていた一つのアイデアは、私の将来のホームファイルサーバーにデータをキャッシュするために30秒の呼び出しを行うためのWebサービスをクエリすることでしたが、現在は構築されていません。 – Rutt

+0

サーバーにpingを実行するプロセスがシングルトンであることを保証することで、サービスベースのアプローチをエミュレートできます。 – x0n

1

低ハイテクソリューションは、asp.netから繰り返し代わりにexeファイルの、exeファイルの呼び出しのそれぞれを行いbatファイルを呼び出すことかもしれません。繰り返したシェルをOSオーバーヘッドに保存する

exeを呼び出すたびに、結果がテキストファイルに変換されます。このファイルは、batからasp.netアプリケーションに制御が戻ってくると一度にすべて読み戻すことができます。

ipの変更のリストがある場合、asp.netアプリケーションは、実行する前にbatファイルを作成できます。

+0

興味深いボックスの考え方の外に。しかし、私はこれがどのようにユーザーのユーザーエクスペリエンスを向上させるのか分かりません。だから、バットを呼び出すのですが、最初の読み込みで30〜60秒かかるとは思いませんか?それ以降はキャッシュされると思いますが、とにかくデータをかなり頻繁に更新したいと思っています。私は私自身のVPSで以前のように予定された仕事がないと思いますが、これは実行可能な選択肢ではありませんか? – Rutt

+0

実際には確かではありませんが、テストは簡単です。単にbatファイルを手動でビルドして実行してください。遅れが外部プログラムの繰り返し実行によって引き起こされたかどうかはわかりませんでした。私があなたのシナリオを完全に理解しているとは言えませんが、通常は簡単に解決策を実装するのを排除するのが好きです。 –

+0

彼がコマンドラインツールを埋め込むとどうなりますか?それは速くなるでしょうか? –

関連する問題