3

有时,如果我们的文件服务器很慢并且页面在超时之前没有完成,ASP.Net 会使用 ThreadAbortException 对其进行处理。如果这种情况发生在 Win32Native.CreateFile 中,它将使文件句柄处于锁定状态,直到我们执行 iisreset。

这是 .NET 中的缺陷吗?我们能做些什么来解决这个糟糕的想法,比如将超时时间提高到某个巨大的数字......我认为 ThreadAbort.Reset 不会有帮助,因为损坏已经完成,我什至没有返回文件句柄从 FileStream 自己关闭它。


在 Microsoft.Win32.Win32Native.CreateFile(字符串 lpFileName,Int32 dwDesiredAccess,FileShare dwShareMode,SECURITY_ATTRIBUTES securityAttrs,FileMode dwCreationDisposition,Int32 dwFlagsAndAttributes,IntPtr hTemplateFile)

在 Microsoft.Win32.Win32Native.SafeCreateFile(字符串 lpFileName,Int32 dwDesiredAccess,FileShare dwShareMode,SECURITY_ATTRIBUTES securityAttrs,FileMode dwCreationDisposition,Int32 dwFlagsAndAttributes,IntPtr hTemplateFile)

在 System.IO.FileStream.Init(字符串路径、FileMode 模式、FileAccess 访问、Int32 权限、Boolean useRights、FileShare 共享、Int32 bufferSize、FileOptions 选项、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean useLongPath)

在 System.IO.FileStream..ctor(字符串路径,FileMode 模式,FileAccess 访问,FileShare 共享,Int32 bufferSize,FileOptions 选项,字符串 msgPath,布尔 bFromProxy)

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

4

2 回答 2

1

看起来您也向 Microsoft Connect 提交了这个问题,但没有在此处更新他们的答案:

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

以下是微软的回复:

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

我猜线程中止(或任何异步异常),最终可以并且将会这样做。

但似乎框架将SafeFileHandle在内部使用打开文件,所以当它悠闲地处理它时,它应该被垃圾收集器关闭。

于 2013-07-30T19:29:32.243 回答
0

finally您是否通过在子句中关闭或使用该方法在代码中正确关闭文件using

于 2013-07-03T02:46:41.273 回答