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

C# 如何处理FileStream.Close/Dispose上的IOException,c#,.net,silverlight,filestream,using-statement,C#,.net,Silverlight,Filestream,Using Statement,基于文档,FileStream.Close/Dispose可以抛出IOException,对于其他流/服务,由于关闭时异常的情况,我已从“使用”状态切换到关闭状态,使连接保持打开状态,基本上处于孤立状态,支持以下模型:此决策由 这里的问题是,在FileStream上,Close实际上是Dispose,并且没有中止。这是在一个无法访问.net 4.5的项目中,因此无法在ReadAsync上手动触发任务取消,那么处理这一问题的最佳策略是什么?或者,如果确实是这样,您能否解释为什么与SQL/WCF/e

基于文档,FileStream.Close/Dispose可以抛出IOException,对于其他流/服务,由于关闭时异常的情况,我已从“使用”状态切换到关闭状态,使连接保持打开状态,基本上处于孤立状态,支持以下模型:此决策由

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


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

直到今天,我还不知道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);
}
上面的代码取自,方法是Write

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

我真的怀疑你是否在使用Win9x系统,所以这真的不是一个考虑因素。第二种情况更可能出现,尽管据我所知,这种情况不大可能出现,而且应该在开发过程中加以考虑

在这种情况下,我会说你可以使用“using”语句。IOException是一个不太可能弹出的边缘,如果它弹出,则很可能在开发过程中弹出

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


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

您在哪里看到FileStream可能引发IOException?据我所知,FileStream.Dispose不会引发异常。在这一点上我可能大错特错,但是快速浏览一下文档并没有显示IOException可能被抛出的位置。当然有可能是我错过了。根据我所看到的情况,我认为将文件流包装在using语句中是很好的。如果您可以提供一个指向说明FileStream.dispose可能引发IOException的文档的链接,我将看一看,看我们是否能为您提供更好的指导。非常感谢,我还没有深入探讨可能引发异常的情况,老实说,我不记得在哪里看到了异常的可能性,是在msdn上,我认为最有可能是在filestream的描述中,他们提到了句柄。绝对不是为windows 98编写的!:),非常感谢你的解释。最终,这归结为我不信任计算机,所以我对高级魔法感到恐慌,所以感谢你减轻了我毫无根据的担忧。
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);
}