[英]HttpWebResponse GetResponseStream hanging in Dispose
I am using HttpWebResponse.GetResponseStream
to access an internet radio stream, and want to read some data from the response stream, and then disconnect.我正在使用
HttpWebResponse.GetResponseStream
访问网络电台 stream,并想从响应 stream 中读取一些数据,然后断开连接。 However, I always hang indefinitely on the Dispose of the stream.但是,我总是无限期地挂在 stream 的处置上。 The unit test below will display "Cleaning up networkStream...", but never get to "Finished".
下面的单元测试将显示“Cleaning up networkStream...”,但永远不会到达“Finished”。 Why is this?
为什么是这样? And should I fix it by just not bothering to Dispose of my networkStream?
我应该通过不打扰我的networkStream来解决它吗?
[Test]
public void CanStreamMP3Radio()
{
string url = @"http://radio.reaper.fm/stream/";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
int total = 0;
byte[] buffer = new byte[1024];
using(var networkStream = resp.GetResponseStream())
{
do
{
int bytesRead = networkStream.Read(buffer, 0, buffer.Length);
Console.WriteLine("{0} bytesRead", bytesRead);
total += bytesRead;
} while (total < 16384);
Console.WriteLine("Cleaning up networkStream...");
}
Console.WriteLine("Finished");
}
EDIT: just found a solution... call req.Abort()
before the end of the using
block.编辑:刚刚找到了一个解决方案......在
using
块结束之前调用req.Abort()
。 Not very elegant, but it works... So the code becomes:不是很优雅,但它可以工作......所以代码变为:
[Test]
public void CanStreamMP3Radio()
{
string url = @"http://radio.reaper.fm/stream/";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
int total = 0;
byte[] buffer = new byte[1024];
var networkStream = resp.GetResponseStream();
do
{
int bytesRead = networkStream.Read(buffer, 0, buffer.Length);
Console.WriteLine("{0} bytesRead", bytesRead);
total += bytesRead;
} while (total < 16384);
Console.WriteLine("Cleaning up HttpWebResponse...");
req.Abort();
}
Console.WriteLine("Finished");
}
Try disposing the
HttpWebResponse
instead:
尝试处理
HttpWebResponse
代替:
[Test] public void CanStreamMP3Radio() { string url = @"http://radio.reaper.fm/stream/"; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse()) { int total = 0; byte[] buffer = new byte[1024]; var networkStream = resp.GetResponseStream(); do { int bytesRead = networkStream.Read(buffer, 0, buffer.Length); Console.WriteLine("{0} bytesRead", bytesRead); total += bytesRead; } while (total < 16384); Console.WriteLine("Cleaning up HttpWebResponse..."); } Console.WriteLine("Finished"); }
It should dispose the
NetworkStream
as well.
它也应该处理
NetworkStream
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.