2009-12-10 4 views
6

次の関数は、Twitterの消防ホースから最初のXメッセージをプルダウンし、しかしにWebResponseブロックのように見える、決して機能を終了します:TwitterのFirehoseストリームを読むときに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

+0

usingステートメントを削除してreader.close()に置き換えると、同じ問題が発生し、ネットワークモニタはアプリケーションがまだデータを受信して​​いるがreader.close()から返されていないことを示しています。 PS - Vista上でのみ動作をテストしました。 – martimedia

+0

私はそれを再現できません(VS 2008 Windows 7 64bit)。それはまったく問題なく動作しています... –

答えて

3

はあなたのWebRequestとしてキャストHttpWebRequest、その後休憩の前にrequest.Abort()

+0

WebRequestをHttpWebRequestとしてキャストしているかどうかにかかわらず、request.Abort()を追加してください。 元のコードがなぜ機能したのかよく分かりませんが、広範囲の.NETクライアントで実行したい場合は、コードにrequest.Abortを追加することを強くお勧めします。 – martimedia

+0

私はこの上に私の髪を引っ張って12時間過ごした:^ –

-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

関連する問題