我的方法看起来像那样。 (Grabbed from here)
private void inetConvert() {
byte[] buf = new byte[1024];
string result;
string xeString = String.Format("http://www.xe.com/ucc/convert.cgi?Amount=1&From={0}&To={1}", srcCurrency, dstCurrency);
System.Net.WebRequest wreq = System.Net.WebRequest.Create(new Uri(xeString));
System.Net.WebResponse wresp = wreq.GetResponse();
Stream respstr = wresp.GetResponseStream();
int read = respstr.Read(buf, 0, 10240); // Error
result = Encoding.ASCII.GetString(buf, 0, read);
curRateLbl.Text= result;
}
问题是,当应用程序执行此应用程序后挂起大约4-5秒后获取此屏幕
我错过了什么?
答案 0 :(得分:12)
缓冲区的大小为1024,但是告诉Read
它可以将最多10240(十倍大小)字节放入缓冲区。如记录所示,它会抛出,因为
偏移量和计数之和大于缓冲区长度。
答案 1 :(得分:1)
最后你有一个额外的0。应该是
int read = respstr.Read(buf, 0, 1024); // Error
这就是为什么你在你的应用程序中使用常量,以避免那些胖乎乎的手指错误。
private void inetConvert() {
private const BUFFER_SIZE = 1024;
byte[] buf = new byte[BUFFER_SIZE];
string result;
string xeString = String.Format("http://www.xe.com/ucc/convert.cgi?Amount=1&From={0}&To={1}", srcCurrency, dstCurrency);
System.Net.WebRequest wreq = System.Net.WebRequest.Create(new Uri(xeString));
// VERY IMPORTANT TO CLEAN UP RESOURCES FROM ANY OBJECT THAT IMPLEMENTS IDisposable
using(System.Net.WebResponse wresp = wreq.GetResponse())
using(Stream respstr = wresp.GetResponseStream())
{
int read = respstr.Read(buf, 0, BUFFER_SIZE); // Error
result = Encoding.ASCII.GetString(buf, 0, read);
curRateLbl.Text= result;
}
}
另请注意,您未正确关闭Stream对象。您可以考虑使用using
语句来帮助管理流中的资源。
但是......我就是这样做的。
private void inetConvert()
{
string xeString= String.Format("http://www.xe.com/ucc/convert.cgi?Amount=1&From={0}&To={1}", srcCurrency, dstCurrency);
System.Net.WebRequest wreq = System.Net.WebRequest.Create(new Uri(xeString));
// VERY IMPORTANT TO CLEAN UP RESOURCES FROM ANY OBJECT THAT IMPLEMENTS IDisposable
using(System.Net.WebResponse wresp = wreq.GetResponse())
using (Stream stream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
curRateLbl.Text = reader.ReadToEnd();
}
}