HttpWebResponse GetResponseStream挂起在Dispose中

本文关键字:Dispose 挂起 GetResponseStream HttpWebResponse | 更新日期: 2023-09-27 17:54:25

我正在使用HttpWebResponse.GetResponseStream访问互联网无线电流,并希望从响应流中读取一些数据,然后断开连接。然而,我总是无限期地挂在流的Dispose上。下面的单元测试将显示"正在清理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");
}

HttpWebResponse GetResponseStream挂起在Dispose中

EDIT:刚刚找到一个解决方案。。。在CCD_ 3块结束之前调用CCD_。不是很优雅,但它有效。。。因此代码变为:

[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");
}

尝试处理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");
}

它也应该处理NetworkStream