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

时间:2014-09-17 16:21:15

标签: c# .net silverlight filestream using-statement

基于文档FileStream.Close / Dispose可以抛出IOException,其他流/服务我已经从'使用'切换,因为关闭时出现异常情况,使连接保持打开状态并且基本上是孤立的,有利于以下模型:MSDN Suggested Practice

支持此决定
try 
{
  //do work
  handler.Close(); //or equivalent
}
catch(IOException)
{
  handler.Abort();  
}
finally
{
  handler.Dispose(); 
}

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

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

1 个答案:

答案 0 :(得分:2)

直到今天,我还不知道FileStream.Dispose / Close可能会抛出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系统,所以这并不是一个考虑因素。第二个更有可能突然出现,虽然我不太可能知道并且应该抓住发展。

我会说你使用"使用"在这种情况下的声明。 IOException是一个不太可能弹出的边缘,如果是,它可能会在开发期间。

除非您在Windows 98计算机上进行开发,否则您应该退出。

旁注:这个答案是基于我对FileStream.cs中代码的解释。如果我做了任何不正确的假设,请告诉我,我会适当地调整我的答案。