2009-12-10 91 views
6

下面的函數將拉低來自Twitter的firehose第X封郵件,但看起來像WebResponse的塊,永遠不會退出功能:爲什麼閱讀Twitter的流水流時不WebResponse的永遠不會結束?

public void GetStatusesFromStream(string username, string password, int nMessageCount) 
{ 
    WebRequest request = WebRequest.Create("http://stream.twitter.com/1/statuses/sample.json"); 
    request.Credentials = new NetworkCredential(username, password); 

    using (WebResponse response = request.GetResponse()) 
    { 
     using (var stream = response.GetResponseStream()) 
     { 
      using (var reader = new StreamReader(stream)) 
      { 
       while (!reader.EndOfStream) 
       { 
        Console.WriteLine(reader.ReadLine()); 

        if (nMessageCount-- < 0) 
         break; 
       } 
       Console.WriteLine("Start iDispose"); 
      } 
      Console.WriteLine("Never gets here!!!"); 
     } 
    } 

    Console.WriteLine("Done - press a key to exit"); 
    Console.ReadLine(); 
} 

但以下工作正常:

public void GetStatusesFromStreamOK(string username, string password, int nMessageCount) 
    { 
    byte[] encbuff = System.Text.Encoding.UTF8.GetBytes(username + ":" + password); 
    //request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encbuff)); 

    string requestString = "GET /1/statuses/sample.json HTTP/1.1\r\n"; 
    requestString += "Authorization: " + "Basic " + Convert.ToBase64String(encbuff) + "\r\n"; 
    requestString += "Host: stream.twitter.com\r\n"; 
    requestString += "Connection: keep-alive\r\n"; 
    requestString += "\r\n"; 

    using (TcpClient client = new TcpClient()) 
    { 
     client.Connect("stream.twitter.com", 80); 

     using (NetworkStream stream = client.GetStream()) 
     { 
      // Send the request. 
      StreamWriter writer = new StreamWriter(stream); 
      writer.Write(requestString); 
      writer.Flush(); 

      // Process the response. 
      StreamReader rdr = new StreamReader(stream); 

      while (!rdr.EndOfStream) 
      { 
       Console.WriteLine(rdr.ReadLine()); 
       if (nMessageCount-- < 0) 
        break; 
      } 

     } 
    } 

    Console.WriteLine("Done - press a key to exit"); 
    Console.ReadLine(); 

} 

我在做什麼錯誤?

+0

你知道它是掛過嗎?你可以附加一個調試器並獲得堆棧跟蹤? 隨口說說,有沒有你的代碼錯誤。這可能是服務器運行不正常或StreamReader中存在錯誤。 你可以使用技術,http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html弄清楚什麼在幕後發生的事情。這將是一個很好的起點。 – feroze 2009-12-13 15:53:02

+0

如果我刪除using語句並替換爲reader.close(),我看到了同樣的問題,網絡監視器顯示應用程序仍在接收數據,但未從reader.close()返回。 PS - 僅在Vista上測試過的行爲。 – martimedia 2009-12-13 22:10:32

+0

我不能複製(VS 2008的Windows 7 64位)。它工作得很好... – 2009-12-14 18:44:16

回答

3

投下你的WebRequest爲一個HttpWebRequest,那麼斷點調用request.Abort()

+0

感謝,加入request.Abort()的伎倆,無論鑄造的WebRequest爲HttpWebRequest的。 不確定爲什麼原始代碼適用於某些人,但強烈建議人們添加request.Abort到他們的代碼中,如果他們想要在各種各樣的.NET客戶端上運行。 – martimedia 2009-12-14 22:31:03

+0

我花了12個小時把我的頭髮拉過來:^( – 2013-09-05 20:33:02

-1

看起來它有事情做與處置過程或「使用」 ...

下面的代碼工作正常(沒有「使用」的語句):

public static void GetStatusesFromStream(string username, string password, int nMessageCount) 
    { 
     WebRequest request = WebRequest.Create("http://stream.twitter.com/1/statuses/sample.json"); 
     request.Credentials = new NetworkCredential(username, password); 

     WebResponse response = request.GetResponse(); 
     { 
      var stream = response.GetResponseStream(); 
      { 
       var reader = new StreamReader(stream); 
       { 
        while (!reader.EndOfStream) 
        { 
         Console.WriteLine(reader.ReadLine()); 

         if (nMessageCount-- < 0) 
          break; 
        } 
       } 
       Console.WriteLine("Never gets here!!!"); 
      } 
     } 

     Console.WriteLine("Done - press a key to exit"); 
     Console.ReadLine(); 
    } 
+0

同意它進一步,但只是因爲你拖延.NET垃圾收集。如果你多次運行這個函數,那麼垃圾收集將會啓動,程序將像以前一樣掛起。 – martimedia 2009-12-13 21:14:50

相關問題