6

次のプログラムはWebに接続し、「msnbc.com」WebページのHTMLコンテンツを取得して、結果を印刷します。Webページからデータを取得するのに2秒以上かかる場合は、メソッドが機能を停止して戻るようにします。例を挙げてこれを行う方法を教えてください。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        gethtml();
        MessageBox.Show("End of program");
    }

    public void gethtml()
    {
        HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create("http://msnbc.com/");

        WebResponse Response = WebRequestObject.GetResponse();
        Stream WebStream = Response.GetResponseStream();

        StreamReader Reader = new StreamReader(WebStream);
        string webcontent = Reader.ReadToEnd();
        MessageBox.Show(webcontent);
    }
}
4

5 に答える 5

12

2秒は、UIをブロックするには長すぎます。たとえば50ミリ秒以下で結果を取得することを計画している場合にのみ、UIをブロックする必要があります。

UIをブロックせずにWebリクエストを実行する方法については、次の記事をお読みください。

http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/

現在ベータリリース中のC#5では、これはすべてはるかに簡単になることに注意してください。C#5では、演算子を使用するだけawaitで、タスクの結果を非同期的に待つことができます。この種のものがC#5でどのように機能するかを確認したい場合は、以下を参照してください。

http://msdn.microsoft.com/en-us/async

于 2012-04-27T16:34:33.177 に答える
6

Timeoutオブジェクトのプロパティを設定しWebRequestます。ドキュメンテーション

MSDNの例:

// Create a new WebRequest Object to the mentioned URL.
WebRequest myWebRequest=WebRequest.Create("http://www.contoso.com");
Console.WriteLine("\nThe Timeout time of the request before setting is : {0} milliseconds",myWebRequest.Timeout);

// Set the 'Timeout' property in Milliseconds.
myWebRequest.Timeout=10000;

// This request will throw a WebException if it reaches the timeout limit before it is able to fetch the resource.
WebResponse myWebResponse=myWebRequest.GetResponse();
于 2012-04-27T16:21:35.433 に答える
4

上記のように。タイムアウト。

    public void gethtml()
    {
        HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create("http://msnbc.com/");
        WebRequestObject.Timeout = (System.Int32)TimeSpan.FromSeconds(2).TotalMilliseconds;
        try
        {
            WebResponse Response = WebRequestObject.GetResponse();
            Stream WebStream = Response.GetResponseStream();

            StreamReader Reader = new StreamReader(WebStream);
            string webcontent = Reader.ReadToEnd();
            MessageBox.Show(webcontent);
        }
        catch (System.Net.WebException E)
        {
            MessageBox.Show("Fail");
        }
    }
于 2012-04-27T16:28:54.483 に答える
2

HttpWebRequestでTimeOutプロパティを使用できます

于 2012-04-27T16:22:19.767 に答える
0

コンテンツの非同期ダウンロードに切り替えることを検討してください。UIスレッドのブロックを停止し、複数のリクエストを簡単に処理できるようになります。UIに影響を与えることなくタイムアウトを大幅に増やすことができ、それでもデータをフェッチするかどうかを応答の受信時に決定できます。

于 2012-04-27T16:26:44.757 に答える