1

背景
私は、PHPサーバーを介して接続するためのリモートC#アプリケーションを構築しています。クライアントプログラムがサーバーによって認識されているかどうかを確認し、ループしてオンライン時間などのログを送信し、コマンドを確認します。なぜ私がやったのか理解できないかもしれないいくつかの部分について漠然とコメントしました。

namespace Revamped_SERVER
    {
        class Program
        {
            static readonly String BASEURL = "http://mysite.com/index.php?";
            static String OLD_ID = default(String);
            static String CURRENT_ID = default(String);
            static string GET(string PHP,Boolean IS_COMMAND)
            {
                using (WebClient CLIENT = new WebClient())
                {
                    string RAW = CLIENT.DownloadString(BASEURL + PHP);
                    if (IS_COMMAND)
                    {
//this is a command, I remove the unique command ID so that previous commands and new ones aren't repeated if they have been submited more than once
                        CURRENT_ID = RAW.Remove(5, RAW.Length - 5);
                        return RAW.Remove(RAW.Length - 154, 154).Replace(CURRENT_ID, "");
                    }
                    else { return RAW.Remove(RAW.Length - 154, 154); } //this part removes extra string from server analytics a pain in the ***.
                }
            }
            static string TIMESTAMP()
            { 
                return DateTime.Now.ToString("M/d/yyy") + " - " + DateTime.Now.ToString("HH:mm:ss tt"); //Time to send to server
            }
            static void Main(string[] args)
            {
                using (WebClient CLIENT = new WebClient())
                {
                    Boolean CONNECTED = false;
                    String Username = Environment.UserName;
                    while (true)
                    {
                        while (CONNECTED == false)
                        {
                            if (GET("REQUEST=ONLINE",false) == "TRUE")
                            {
                                CONNECTED = true;
                            }
                        }
                        if (CONNECTED)
                        {
                            if (GET("REQUEST=CHECK",false) == "FALSE")
                            {
                                CLIENT.OpenRead(BASEURL + "REQUEST=ADD");
                            }
                            CLIENT.OpenRead(BASEURL + "DATA=" + Username + "\r\nLast online at " + TIMESTAMP());
                            try
                            {
//this is where it gets stuck

                                String COMMAND = GET("REQUEST=COMMAND",true);
                                if (CURRENT_ID != OLD_ID)
                                {
                                    OLD_ID = CURRENT_ID; //Set new ID 
                                    MessageBox.Show(COMMAND); //Show what Commands was sent by server
                                }
                            }
                            catch
                            {
                                CONNECTED = false; 
                            }
                        }
                    }
                }
            }
        }
    }


問題
最初のループでは、完全に機能します。接続し、サーバーによって認識されているかどうかを確認してから、コマンドを確認します。ただし、再びループすると、ログが送信されますが、次の状態のままになります。

String COMMAND = GET("REQUEST=COMMAND",true);

エラーは発生しませんが、Webクライアントのマウスにカーソルを合わせると次のように表示されます。

現在のメソッドのコードが最適化されているため、式を評価できません。

私はこの記事を見てきましたが、私の場合、これを回避する方法を説明していません。

http://blogs.msdn.com/b/jmstall/archive/2005/11/15/funceval-rules.aspx

このWebClientが2番目のループでスタックしているのは何が問題になっていますか?


詳細

  • .NET4.5を使用しています
  • Windows764ビット
  • Visual Studios 2012
  • サーバーはオンラインで完全に機能しています
4

1 に答える 1

1

WebClient.OpenReadは、応答を読み取るためにストリーム リーダーに渡す必要があるストリームを返します。

あなたの場合、返されたストリームをまったく使用していません。あなたは webclient のインスタンスを再利用しているので、これがあなたが言及した動作の原因であると思います.

于 2013-03-02T16:55:58.963 に答える