3

偶尔地,如果我们的文件服务器速度很慢,并且页面没有按其超时完成,ASP.Net会以ThreadAbortException命中它。如果这发生在Win32Native.CreateFile内部,它将锁定文件句柄直到我们执行iisreset。ASP.Net中的ThreadAbortException 4泄露文件句柄?

这是.NET中的缺陷吗?有没有什么我们可以做的关于短暂的不良想法,如提高超时到一些巨大的数字......我不认为ThreadAbort.Reset会有帮助,因为损坏已经完成,我甚至没有文件句柄返回从FileStream自己关闭它。


在Microsoft.Win32.Win32Native.CreateFile(字符串lpFileName的对象,的Int32 dwDesiredAccess,文件共享dwShareMode,SECURITY_ATTRIBUTES securityAttrs,的FileMode CREATE_NEW标志,的Int32 dwFlagsAndAttributes,IntPtr的hTemplateFile)

在Microsoft.Win32.Win32Native.SafeCreateFile(字串lpFileName的对象,的Int32 dwDesiredAccess,文件共享dwShareMode,SECURITY_ATTRIBUTES securityAttrs,的FileMode CREATE_NEW标志,的Int32 dwFlagsAndAttributes,IntPtr的hTemplateFile)

在System.IO.FileStream.Init(字符串路径,模式的FileMode,FileAccess的访问,的Int32权利,布尔useRights,FileShare共享,Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,字符串msgPath,布尔bFromProxy,布尔useLongPath)

at System.IO.FileStream..ctor(String path,FileMode mode,FileAccess access,FileShare share, INT32缓冲区大小,FileOptions选项,字符串MSGPATH,布尔bFromProxy)

在System.IO.FileStream..ctor(字符串路径的FileMode模式)

回答

0

你是通过在正确关闭该文件中的代码闭上你的finally子句或通过使用using的方法?

+0

是的,它发生在内部框架代码以及缓存的文件依赖关系。 – ss2k 2014-02-13 17:08:55

1

看起来你提交这个问题给微软连接也并没有与他们的答案在这里更新:

http://connect.microsoft.com/VisualStudio/feedback/details/739044/threadabortexception-in-asp-net-4-during-new-filestream-leaking-file-handle

下面是来自微软的响应:执行长时间运行

不建议使用ASP.NET 中的同步请求中的操作。如果您打到超时期限,您可以选择 来简单地增加配置的请求超时,或者使用异步请求更改为 ,异步请求在异步操作的执行 期间不会超时,因此不会抛出线程中止 例外。

我想线程中止(或任何异步异常),最终可以做到这一点。

但是看起来框架在内部打开文件时会使用SafeFileHandle,所以当垃圾收集器闲置时它应该被垃圾收集器关闭。

+0

他们的回答没有用,因为这是我无法控制的超时。悠闲地得到它的一部分不能很好地工作在一个忙碌的Web应用程序中的锁定文件... – ss2k 2013-10-21 16:48:43

+0

@ ss2k了解。从来没有说过这是一个好的答案,但它是事实:异步例外是不安全的。您应该考虑在相关页面中运行一个计时器,该计时器可以以更安全的方式取消该请求,而不会出现在“CreateFile”中。 – 2013-12-31 17:48:03