C# 如果方法花费的时间超过 2 秒,如何停止该方法
本文关键字:方法 何停止 如果 时间 | 更新日期: 2023-09-27 18:32:32
以下程序将连接到网络并获取"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);
}
}
两秒钟太长,无法阻止 UI。仅当您计划获取结果时,才应阻止 UI,例如 50 毫秒或更短时间。
阅读本文,了解如何在不阻止 UI 的情况下执行 Web 请求:
http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/
请注意,在目前处于测试版的 C# 5 中,这一切都会容易得多。在 C# 5 中,只需使用 await
运算符即可异步等待任务结果。如果您想了解这种事情在 C# 5 中的工作方式,请参阅:
http://msdn.microsoft.com/en-us/async
设置WebRequest
对象的 Timeout
属性。文档
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();
如上所述。超时
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");
}
}
您可以使用 HttpWebRequest 上的 TimeOut 属性
考虑切换到内容的异步下载。您将停止阻止 UI 线程,并且能够轻松处理多个请求。您将能够显著增加超时,而不会影响 UI,并且如果您仍要获取数据,则可以决定何时接收响应。