次の関数は、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();
}
は私が何をしています違う?それは廃棄プロセスとは何かを持っているか「を使用して」のような
どこに掛かっているのですか?デバッガを接続してスタックトレースを取得できますか? あなたのコードに問題はありません。サーバーが誤動作しているか、StreamReaderにバグがある可能性があります。 http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.htmlのテクニックを使って、何が起こっているのかを把握することができます。それは良い出発点です。 – feroze
usingステートメントを削除してreader.close()に置き換えると、同じ問題が発生し、ネットワークモニタはアプリケーションがまだデータを受信しているがreader.close()から返されていないことを示しています。 PS - Vista上でのみ動作をテストしました。 – martimedia
私はそれを再現できません(VS 2008 Windows 7 64bit)。それはまったく問題なく動作しています... –