我有一个像这样的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方法抛出CommunicationException
...等待互联网连接恢复
重新开始上传最后一块
繁荣!!!引发以下异常:



  该进程无法访问文件“ some-path”,因为它正在被另一个进程使用。


我知道该文件没有被其他任何人触摸,这导致我在连接断开时上次调用时该文件保持打开状态。但是据我所知,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# - FileStream即使在using语句中也不会关闭,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30078304/

10-10 12:57