0

C# でテスト Web 接続フォームを作成しました。接続のチェック中に読み込みウィンドウを表示し、チェックの結果を表示したい。

これは、Web 接続をテストするための私のコードです。

   public bool ConnectionAvailable(string strServer)
   {
        try
        {
            HttpWebRequest reqFP = (HttpWebRequest)HttpWebRequest.Create(strServer);

           HttpWebResponse rspFP = (HttpWebResponse)reqFP.GetResponse();
            if (HttpStatusCode.OK == rspFP.StatusCode)
            {
              // HTTP = 200 - Internet connection available, server online
                rspFP.Close();
                return true;
            }
            else
           {
               // Other status - Server or connection not available
                rspFP.Close();
                return false;
            }
        }
        catch (WebException)
        {
            // Exception - connection not available
            return false;
        }
    }

この:

    private void button1_Click(object sender, EventArgs e)
    {
        string url = "Web-url";
        label1.Text = "Checking ...";
        button1.Enabled = false;

        if (ConnectionAvailable(url))
        {
            WebClient w = new WebClient();
            w.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
            label1.Text = w.UploadString(url, "post", "SN=" + textBox1.Text);
            button1.Enabled = true;
        }
        else
        {
            label1.Text = "Conntion fail";
            button1.Enabled = true;
        }

    }
4

2 に答える 2

0

Windows フォーム アプリケーションでは、ユーザー インターフェイスは 1 つのスレッドで実行されます。長時間実行されるプロセスを実行しようとすると、Web 接続をチェックすると、作業が完了するまでフォームがフリーズする可能性があります。

そのため、チェックを行う新しいスレッドを開始します。次に、イベントを発生させて結果を返します。すべてが起こっている間、ローディンググラフィックなどのユーザーインターフェイスで好きなことをしたり、ユーザーがインターネット接続を必要としない機能を引き続き使用できるようにすることもできます.

結果を返すことができるように、独自の EventArgs クラスを作成します。

public class ConnectionResultEventArgs : EventArgs
{
    public bool Available { get; set; }
}

次に、フォームクラスで、イベント、ハンドラー、およびイベントが到着したときにアクションを実行するメソッドを作成します

//Create Event and Handler
    public delegate void ConnectionResultEventHandler(object sender, ConnectionResultEventArgs e);
    public event ConnectionResultEventHandler ConnectionResultEvent;

//Method to run when the event has been receieved, include a delegate in case you try to interact with the UI thread
    delegate void ConnectionResultDelegate(object sender, ConnectionResultEventArgs e);
    void ConnectionResultReceived(object sender, ConnectionResultEventArgs e)
    {
        //Check if the request has come from a seperate thread, if so this will raise an exception unless you invoke.
        if (InvokeRequired)
        {
            BeginInvoke(new ConnectionResultDelegate(ConnectionResultReceived), new object[] { this, e });
            return;
        }

        //Do Stuff
        if (e.Available)
        {
            label1.Text = "Connection Good!";
            return;
        }

        label1.Text = "Connection Bad";
    }

フォームが読み込まれたときにイベントをサブスクライブします。

private void Form1_Load(object sender, EventArgs e)
    {
        //Subscribe to the the results event.
        ConnectionResultEvent += ConnectionResultReceived;
    }

次に、ワーカー スレッドをセットアップします。

//Check the connection
    void BeginCheck()
    {
        try
        {
            HttpWebRequest reqFP = (HttpWebRequest)HttpWebRequest.Create("http://google.co.uk");

            HttpWebResponse rspFP = (HttpWebResponse)reqFP.GetResponse();
            if (HttpStatusCode.OK == rspFP.StatusCode)
            {
                // HTTP = 200 - Internet connection available, server online
                rspFP.Close();

                ConnectionResultEvent(this, new ConnectionResultEventArgs {Available = true});
            }
            else
            {
                // Other status - Server or connection not available
                rspFP.Close();

                ConnectionResultEvent(this, new ConnectionResultEventArgs { Available = false });
            }
        }
        catch (WebException)
        {

            // Exception - connection not available
            //Raise the Event - Connection False
            ConnectionResultEvent(this, new ConnectionResultEventArgs { Available = false });
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //loading graphic, screen or whatever
        label1.Text = "Checking Connection...";

        //Begin the checks - Start this in a new thread
        Thread t = new Thread(BeginCheck);
        t.Start();
    }
于 2013-08-24T06:56:14.263 に答える
0

スレッドを考えています!1 つのスレッドが接続をチェックし、もう 1 つのスレッドが読み込みウィンドウを表示しています。たとえば、接続が確立されている場合は、他のスレッドに通知して結果を表示できます。

于 2013-08-24T06:20:41.807 に答える