在while-block之后无法访问代码

时间:2017-04-19 08:09:52

标签: c#

我的代码中有一个奇怪的问题,我试图从服务器的响应流中转换文件。

但是当我使用Stream.CopyTo()或下面的方法进行调试时,它永远不会到达fs.Flush()

enter image description here

我可以到达while-block并且没有无限循环。当bs.Read到达结尾时,循环也会结束,但只是在它之后没有到达代码。

3 个答案:

答案 0 :(得分:1)

虽然是一个循环,但在条件等于false之前不会结束。因此,让我们说currentDataLength的值随每个cpu周期而变化,但总是大于0(或永远不会低于0),它会继续下去。

看到您在currentDataLength循环之外更改while的值,然后再在其中。它有可能继续下去,直到bs.Read()返回一些消极的东西。

一个好主意是改变while循环的条件。但这完全取决于您的代码的使用。

答案 1 :(得分:1)

我认为您甚至不需要调用fs.Flush(),因为您位于using块内 - 实现IDisposable并且应该自动处理将流写入文件的时间物品处理完毕。

我认为这可能与您使用大于BufferedStream的默认缓冲区大小(4096字节(使用默认值初始化BufferedStream)这一事实有关)。所以Read总是会在读取的字节少于请求的情况下结束。在这种情况下,如果从端口/管道读取,则读取可能会死锁。看看the source code for Read here.

中发生了什么

答案 2 :(得分:0)

while循环永远不会返回,因为param stream正在等待来自我的服务器的新响应。因此,Read(...)方法永远无法结束,因为它等待响应关闭。

因此,当它到达流的结束(当前)时,主线程将暂停以获得新响应,并且看起来像是一个无限循环。

我更改了服务器代码,然后解决了问题:

public static void SendFile(HttpListenerResponse oResp, string filePath, long startPoint)
{
    using (FileStream fs = File.OpenRead(filePath))
    {
        fs.Seek(startPoint, SeekOrigin.Begin);
        fs.CopyTo(oResp.OutputStream);
        //Added: close the response
        oResp.Close();
    }
}

否则,我发现问题描述中的代码中的fs.Flush仍然无法覆盖,我猜它可能在using阻止无效。