偶尔如果我们的文件服务器很慢并且页面没有按其超时完成,ASP.Net将使用ThreadAbortException命中它。如果在Win32Native.CreateFile中发生这种情况,它会使文件句柄处于锁定状态,直到我们执行iisreset。
这是.NET的一个缺陷吗?有什么我可以做的关于这个简短的想法,如将超时提升到一些巨大的数字...我不认为ThreadAbort.Reset会有所帮助,因为损坏已经完成,我甚至没有返回文件句柄从FileStream自己关闭它。
at Microsoft.Win32.Win32Native.CreateFile(String lpFileName,Int32 dwDesiredAccess,FileShare dwShareMode,SECURITY_ATTRIBUTES securityAttrs,FileMode dwCreationDisposition,Int32 dwFlagsAndAttributes,IntPtr hTemplateFile)
at Microsoft.Win32.Win32Native.SafeCreateFile(String lpFileName,Int32 dwDesiredAccess,FileShare dwShareMode,SECURITY_ATTRIBUTES securityAttrs,FileMode dwCreationDisposition,Int32 dwFlagsAndAttributes,IntPtr hTemplateFile)
at System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,Int32 bufferSize,FileOptions options,SECURITY_ATTRIBUTES secAttrs,String msgPath,Boolean bFromProxy,Boolean useLongPath)
at System.IO.FileStream..ctor(String path,FileMode mode,FileAccess access,FileShare share,Int32 bufferSize,FileOptions options,String msgPath,Boolean bFromProxy)
在System.IO.FileStream..ctor(String path,FileMode mode)
答案 0 :(得分:1)
看起来您已将此问题提交给Microsoft Connect,并且未在此处更新其答案:
以下是Microsoft的回复:
在ASP.NET中的同步请求中执行长时间运行的操作 不推荐。如果你正在达到超时期限,你可以 选择只是增加配置的请求超时或更改为 使用异步请求,在执行期间不会超时 异步操作,因此不抛出线程中止 异常。
我猜线程中止(或任何异步异常),最终可以并且将会这样做。
但是看起来框架会在打开文件时在内部使用SafeFileHandle
,因此垃圾收集器在闲暇时会被它关闭。
答案 1 :(得分:0)
您是通过关闭finally
子句还是使用using
方法在代码中正确关闭文件?