【问题标题】:Can't reach the code after a while-block一段时间后无法访问代码
【发布时间】:2017-04-19 08:09:51
【问题描述】:

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

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

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

【问题讨论】:

  • 请将您的代码发布为文本,而不是图像。
  • 我猜你的 currentDataLength 总是大于 0
  • 而不是while使用for循环
  • 显示您的呼叫地址SaveFile
  • offsetbyteArr 的起始索引,所以我只是在每个调用的bs.Read(...) 中更新byteArr

标签: c#


【解决方案1】:

While 是一个在条件等于false 之前不会结束的循环。因此,假设currentDataLength 的值随着每个 cpu 周期而变化,但始终大于0(或永远不会低于0),它将继续下去。

看到您在while 循环之外更改了currentDataLength 的值一次,然后又在循环内部更改了一次。它很有可能会一直持续到bs.Read() 返回一些负面的东西。

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

【讨论】:

    【解决方案2】:

    我认为你甚至不需要调用 fs.Flush(),因为你在一个 using 块内 - 它实现了 IDisposable 并且应该在对象被释放时自动将流写入文件。

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

    【讨论】:

    • 这是对代码的评论,不是对所问问题的回答。我也很确定需要调用Flush...
    • 我遇到过需要明确致电Flush 的情况,无论哪种方式,您都没有按要求回答问题。 OP想知道为什么不调用Flush,而不是他们是否应该调用它。
    • 在您进行编辑后,我已经删除了我的反对票,这似乎是一个合理的断言。如果您认为源代码是相关的,那么可能值得直接将其中的一部分添加到您的答案中;许可当然允许。
    • 谢谢,源代码已经明确注释了这种情况。
    【解决方案3】:

    while 循环永远不会返回,因为参数 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块中无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      相关资源
      最近更新 更多