我有一个像这样的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/