如何在Windows窗体应用程序中检查Web连接时创建加载窗口?

时间:2013-08-24 05:22:04

标签: c# web connection

我在c#中有一个测试网络连接表单。我想在检查连接时显示加载窗口,然后显示检查结果。

这是我测试网络连接的代码:

   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;
        }

    }

2 个答案:

答案 0 :(得分:0)

我正在考虑线程化!一个线程检查连接,而另一个线程显示加载窗口。例如,如果已建立连接,则可以通知另一个线程并显示结果。

答案 1 :(得分:0)

在Windows窗体应用程序上,用户界面在一个线程上运行,如果您尝试运行一个长时间运行的进程,检查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();
    }