如何处理FileStream.Close/Dispose上的IOException



根据文档FileStream.Close/Dispose可能会引发IOException,而其他流/服务由于关闭时出现异常而使连接打开并基本上孤立,因此我已不再"使用":此决定得到MSDN建议做法的支持

try 
{
  //do work
  handler.Close(); //or equivalent
}
catch(IOException)
{
  handler.Abort();  
}
finally
{
  handler.Dispose(); 
}

这里的问题是,在FileStream Close上本质上是Dispose,并且没有Abort。这是在一个无法访问.net 4.5的项目中,因此无法在ReadAsync上手动触发任务取消,那么处理这一问题的最佳策略是什么?或者,如果确实是这样的话,你能解释为什么这实际上不是一个与SQL/WWCF/etc连接不同的问题吗?

此场景中的用例是将用户图像上载到Silverlight控件。我目前使用"using",因为它比t/c/f块更简洁/可读,在这种情况下,它不会增加我能找到的任何值。

直到今天,我都不知道FileStream.Dispose/Colose可以抛出IOException,但事实证明它可以。并不是说我认为OP是错的。

else {
    // ERROR_INVALID_PARAMETER may be returned for writes
    // where the position is too large (ie, writing at Int64.MaxValue 
    // on Win9x) OR for synchronous writes to a handle opened 
    // asynchronously.
    if (hr == ERROR_INVALID_PARAMETER)
        throw new IOException(Environment.GetResourceString("IO.IO_FileTooLongOrHandleNotSync"));
    __Error.WinIOError(hr, String.Empty);
}

上面的代码取自FileStream.cs,方法是Write。

有两种情况下,在Dispose/Close期间会引发IOException。一种是在Win9x系统上使用大于Int64.maxValue的位置。第二个是尝试同步写入异步打开的句柄。

我真的怀疑你使用的是Win9x系统,所以这真的不是一个考虑因素。第二个更有可能出现,尽管据我所知,它不太可能出现,应该处于发展阶段。

我想说,在这种情况下,你可以使用"using"语句。IOException是一个不太可能出现的边缘,如果出现了,很可能是在开发过程中。

当然,除非你是在Windows98机器上开发的,否则你应该退出。

附带说明:这个答案是基于我对FileStream.cs中代码的解释。如果我做出了任何错误的假设,请告诉我,我会适当调整我的答案。

最新更新