基于文档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块更简洁/可读,在这种情况下,它不会添加任何我能找到的值。
答案 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中代码的解释。如果我做了任何不正确的假设,请告诉我,我会适当地调整我的答案。