0

我的方法看起来像这样。(从这里抓取)

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 秒后得到这个屏幕

在此处输入图像描述

我错过了什么?

4

2 回答 2

12

缓冲区的大小为 1024,但您告诉Read它最多可以将 10240(大小的十倍)字节放入缓冲区。如文件所述,它抛出是因为

偏移量和计数之和大于缓冲区长度。

于 2012-07-08T18:04:56.473 回答
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(); 
    } 
}  
于 2012-07-08T18:06:08.013 回答