隨筆-348  評(píng)論-598  文章-0  trackbacks-0
          HttpWebRequest myRequest = null;
                      HttpWebResponse myResponse 
          = null;
                      Stream reqStream 
          = null
                      Stream resStream 
          = null;

                      
          try
                      
          {
                          
          byte[] data = System.Text.Encoding.Default.GetBytes(param);

                          myRequest = (HttpWebRequest)WebRequest.Create(url);
                          myRequest.Method 
          = "POST";
                          myRequest.KeepAlive 
          = true;
                          myRequest.ContentType 
          = "application/octet-stream";
                          myRequest.ContentLength 
          = data.Length;
                          reqStream 
          = myRequest.GetRequestStream();
                          reqStream.Write(data, 
          0, data.Length);
                          reqStream.Close();

                          myResponse 
          = (HttpWebResponse)myRequest.GetResponse();
                          resStream 
          = myResponse.GetResponseStream();
                          data 
          = new byte[512];
                          
          int count = 0;
                          UIFactory.zZRK_MODIForm.memStream 
          = new MemoryStream();
                          
          while ((count = resStream.Read(data, 0, data.Length)) > 0)
                          
          {
                              UIFactory.zZRK_MODIForm.memStream.Write(data, 
          0, count);
                          }

                          resStream.Close();
                          
                      }

                      
          catch
                      
          {
                      }

                      
          finally
                      
          {
                          
          if (resStream != null)
                          
          {
                              resStream.Close();
                          }

                          
          if (reqStream != null)
                          
          {
                              reqStream.Close();
                          }

                          
          if (myResponse != null)
                          
          {
                              myResponse.Close();
                          }

                      }
          大家看下這段程序,有問題嗎?乍一看,好像沒有什么問題,所有的流都釋放了,Response也釋放了。。不過如果你寫個(gè)循環(huán)無限次發(fā)起請(qǐng)求,你會(huì)發(fā)現(xiàn),運(yùn)行不了幾次就阻塞了。為什么呢?大家看下面的代碼
          HttpWebRequest myRequest = null;
                      HttpWebResponse myResponse 
          = null;
                      Stream reqStream 
          = null
                      Stream resStream 
          = null;

                      
          try
                      
          {
                          
          byte[] data = System.Text.Encoding.Default.GetBytes(param);

                          
          //想服務(wù)器端發(fā)送請(qǐng)求,獲取照片信息
                          myRequest = (HttpWebRequest)WebRequest.Create(url);
                          myRequest.Method 
          = "POST";
                          myRequest.KeepAlive 
          = true;
                          myRequest.ContentType 
          = "application/octet-stream";
                          myRequest.ContentLength 
          = data.Length;
                          reqStream 
          = myRequest.GetRequestStream();
                          reqStream.Write(data, 
          0, data.Length);
                          reqStream.Close();

                          myResponse 
          = (HttpWebResponse)myRequest.GetResponse();
                          resStream 
          = myResponse.GetResponseStream();
                          data 
          = new byte[512];
                          
          int count = 0;
                          UIFactory.zZRK_MODIForm.memStream 
          = new MemoryStream();
                          
          while ((count = resStream.Read(data, 0, data.Length)) > 0)
                          
          {
                              UIFactory.zZRK_MODIForm.memStream.Write(data, 
          0, count);
                          }

                          resStream.Close();
                          
                      }

                      
          catch
                      
          {
                      }

                      
          finally
                      
          {
                          
          if (resStream != null)
                          
          {
                              resStream.Close();
                          }

                          
          if (reqStream != null)
                          
          {
                              reqStream.Close();
                          }

                          
          if (myResponse != null)
                          
          {
                              myResponse.Close();
                          }

                          
          if (myRequest != null)
                          
          {
                              myRequest.Abort();
                          }

                      }
          多了些什么?多了這個(gè)
                          if (myRequest != null)
                          
          {
                              myRequest.Abort();
                          }
          其實(shí)很多時(shí)候釋放了Stream和Response還不夠,客戶端的Request還是在保持著,需要等垃圾回收器來回收,所以一般很容易阻塞,導(dǎo)致請(qǐng)求發(fā)送不出去。加上這個(gè)就是讓HttpWebRequest實(shí)例在不需要的時(shí)候及時(shí)釋放資源。這樣可以重復(fù)使用而不會(huì)阻塞。

          ---------------------------------------------------------
          專注移動(dòng)開發(fā)

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2008-09-08 12:52 TiGERTiAN 閱讀(7865) 評(píng)論(3)  編輯  收藏 所屬分類: DotNetWindows Mobile

          評(píng)論:
          # re: HttpWebRequest使用注意(發(fā)生阻塞的解決辦法)[未登錄] 2008-11-08 09:21 | aa
          # re: HttpWebRequest使用注意(發(fā)生阻塞的解決辦法) 2010-02-21 11:03 | OverGame
          看了此文才發(fā)現(xiàn)錯(cuò)誤的所在,謝謝分享  回復(fù)  更多評(píng)論
            
          # re: HttpWebRequest使用注意(發(fā)生阻塞的解決辦法)[未登錄] 2010-06-11 20:42 | Tony
          這個(gè)問題在PC上還不明顯,PC默認(rèn)能建立25個(gè)連接。
          但是在Windows Mobile上就很明顯了,我在Windows Mobile上做應(yīng)用,2個(gè)request發(fā)出后,再發(fā)第三個(gè)馬上就阻塞抽住了,Debugger也無法catch,因?yàn)镈ebugger也要占用連接。
          感謝樓主分享。
            回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 德保县| 涡阳县| 邹平县| 景洪市| 焦作市| 光泽县| 永宁县| 万安县| 荥经县| 长武县| 略阳县| 正安县| 伊宁市| 南和县| 松江区| 盐城市| 海盐县| 扬州市| 怀安县| 仪陇县| 修水县| 沙雅县| 江北区| 靖江市| 沧州市| 电白县| 凤城市| 泸州市| 太仆寺旗| 轮台县| 临清市| 庆阳市| 万安县| 鄢陵县| 江油市| 隆子县| 镇原县| 鹤庆县| 万山特区| 大连市| 武城县|