隨筆-348  評論-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也釋放了。。不過如果你寫個循環無限次發起請求,你會發現,運行不了幾次就阻塞了。為什么呢?大家看下面的代碼
          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();
                          }

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

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

          ---------------------------------------------------------
          專注移動開發

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

          評論:
          # re: HttpWebRequest使用注意(發生阻塞的解決辦法)[未登錄] 2008-11-08 09:21 | aa
          good  回復  更多評論
            
          # re: HttpWebRequest使用注意(發生阻塞的解決辦法) 2010-02-21 11:03 | OverGame
          看了此文才發現錯誤的所在,謝謝分享  回復  更多評論
            
          # re: HttpWebRequest使用注意(發生阻塞的解決辦法)[未登錄] 2010-06-11 20:42 | Tony
          這個問題在PC上還不明顯,PC默認能建立25個連接。
          但是在Windows Mobile上就很明顯了,我在Windows Mobile上做應用,2個request發出后,再發第三個馬上就阻塞抽住了,Debugger也無法catch,因為Debugger也要占用連接。
          感謝樓主分享。
            回復  更多評論
            
          主站蜘蛛池模板: 平乐县| 克东县| 无为县| 榆社县| 内江市| 永康市| 夏河县| 高邮市| 东安县| 毕节市| 普宁市| 当雄县| 晋宁县| 罗江县| 策勒县| 平凉市| 阿坝县| 珠海市| 滕州市| 晋州市| 甘洛县| 宾阳县| 察哈| 泸定县| 安泽县| 新乐市| 登封市| 大名县| 资兴市| 星座| 武城县| 都安| 浦东新区| 大悟县| 曲松县| 平利县| 西吉县| 麻阳| 祁连县| 香格里拉县| 樟树市|