c# - 即使在 using 语句中,FileStream 也不会关闭

标签 c# wcf filestream using

我有一个像这样的 wcf 方法来上传文件 block :

public void UploadChunk ( RemoteFileChunk file )
{
    using ( var targetStream = new FileStream("some-path", FileMode.OpenOrCreate, FileAccess.Append, FileShare.None) )
    {
        file.Stream.CopyTo(targetStream);
        file.Stream.Close();
    }
}

这是非常基本的东西。但是在异常(exception)情况下发生的事情非常奇怪。异常(exception)情况步骤:

  1. 开始上传 block
  2. 上传过程中互联网连接松动
  3. UploadChunk 方法因失去互联网连接而抛出 CommunicationException
  4. ...等待互联网连接恢复
  5. 再次开始上传最后一 block
  6. 砰!!!抛出以下异常:

The process cannot access the file 'some-path' because it is being used by another process.

我知道该文件没有被其他任何人触及,这让我知道该文件在连接丢失时的最后一次调用中保持打开状态。但据我所知,using 语句应该关闭 FileStream,但在本例中它没有。

我可能在这里遗漏了什么?

顺便说一句,我还有一个 question我猜这是由我不知道的相同问题引起的。也许它可以引导你们找到一些线索。

最佳答案

什么是 RemoteFileChunk?我的猜测是打开文件的是 RemoteFileChunk。您没有显示 RemoteFileChunk 的任何代码,这些代码表明它会在发生异常时自动关闭其 Stream 。这应该可行(尽管将关闭封装在 RemoteFileChunk 本身中可能更好):

public void UploadChunk ( RemoteFileChunk file )
{
    using ( var targetStream = new FileStream("some-path", FileMode.OpenOrCreate, FileAccess.Append, FileShare.None) )
    {
        try
        {
            file.Stream.CopyTo(targetStream);
        }
        finally
        {
            file.Stream.Close();
        }
    }
}

关于c# - 即使在 using 语句中,FileStream 也不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30078304/

相关文章:

c# - 我想使用 c# 从共享点列表中检索数据并将它们存储到 SQL Server 数据库表中。我怎样才能做到这一点?

c# - .Net 如何直接播放音频样本

c# - 从 Web API 核心下载文件 - Angular 7

delphi - 将文件复制到剪贴板

c# - PDFsharp 1.50 测试版 3 : Empty owner password error when adding password to PDF

wcf - 双向 WCF 服务操作返回不回复而不是异常

c# - 如何获取 WCF Web 服务请求的 XML SOAP 请求?

wcf - 根据验证程序,远程证书无效

sql-server - SQL Server 2008 文件流 : Error when creating database with filestream

c# - FileStream 慢速,快速读取方式读取许多文件的几个字节