6

以下程序将连接到网络并获取“msnbc.com”网页的html内容并打印出结果。如果从网页获取数据的时间超过 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

两秒钟对于阻止 UI来说太长了。如果您计划在 50 毫秒或更短的时间内获得结果,您应该只阻止 UI。

阅读这篇文章,了解如何在不阻塞 UI 的情况下执行 Web 请求:

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

请注意,在 C# 5 中,这一切都会变得容易得多,目前它是 beta 版本。在 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 回答