C# 即使文件流为';在using语句中

C# 即使文件流为';在using语句中,c#,wcf,filestream,using,C#,Wcf,Filestream,Using,我有一个像这样的wcf方法来上传文件块: public void UploadChunk ( RemoteFileChunk file ) { using ( var targetStream = new FileStream("some-path", FileMode.OpenOrCreate, FileAccess.Append, FileShare.None) ) { file.Stream.CopyTo(targetStream); fil

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

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();
    }
}
这是非常基本的东西。但在特殊情况下会发生什么是相当奇怪的。例外情况步骤:

  • 开始上传区块
  • 上传过程中互联网连接松动
  • UploadChunk方法由于失去internet连接而引发
    CommunicationException
  • …等待internet连接恢复
  • 再次开始上载最后一个区块
  • 轰!!!引发以下异常:
  • 进程无法访问文件“某些路径”,因为另一进程正在使用该文件

    我知道该文件没有被任何人接触,这导致我在上次通话中,当连接丢失时,该文件保持打开状态。但据我所知,使用语句应该关闭
    文件流
    ,但在本例中它没有关闭

    我可能会错过什么


    顺便说一句,我有另一个问题,我猜是由我不知道的同一个问题引起的。也许它能让你们找到一些线索。

    什么是RemoteFileChunk?我猜是RemoteFileChunk打开了文件。您尚未显示RemoteFileChunk的任何代码,该代码演示了在发生异常时它将自动关闭其流。这应该是可行的(尽管最好将close封装在RemoteFileChunk本身中):


    因为您原来的流式处理操作没有完成。您重新尝试时,
    UploadChunk
    的最初执行是否失败?网络超时可能比您预期的时间长。我假设您遇到异常。在这种情况下,您应该将代码包围在try-catch-finally块中,并关闭流,无论发生什么意外情况。@Richard和@T McKeown我已经添加了第三步。第一次呼叫以
    通信异常结束,然后在互联网连接恢复后,我打第二次呼叫。@Richard,当你说超时时,我给了它一个机会,并等待了稍长一点(2-3分钟),现在它可以成功地打电话了。但它仍然是wierd,因为第一次调用实际上是在一个异常情况下完成的,我的服务和客户端的openTimeOut值是5分钟。给出异常的路径是“某个路径”,它与
    file.Stream
    有什么关系?
    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();
            }
        }
    }