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 (サイズの 10 倍) バイトをバッファーに格納できることがわかります。文書化されているように、それはスローします

オフセットとカウントの合計がバッファー長を超えています。

于 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 に答える