我的代码中有一个奇怪的问题,我试图从服务器的响应流中转换文件。
但是当我使用Stream.CopyTo()
或下面的方法进行调试时,它永远不会到达fs.Flush()
。
我可以到达while-block并且没有无限循环。当bs.Read
到达结尾时,循环也会结束,但只是在它之后没有到达代码。
答案 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
阻止无效。