【问题标题】:ThreadAbortException in ASP.Net 4 leaking file handle?ASP.Net 4 中的 ThreadAbortException 泄漏文件句柄?
【发布时间】:2012-04-25 20:14:45
【问题描述】:

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

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


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

在 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 模式)

【问题讨论】:

    标签: .net multithreading exception-handling thread-safety resource-leak


    【解决方案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 打开文件,所以当它闲暇时应该被垃圾收集器关闭。

    【讨论】:

    • 他们的回答没有用,因为这是我无法控制的超时。在繁忙的网络应用程序中锁定文件时,悠闲地解决它的部分效果并不好......
    • @ss2k 明白了。从来没有说过这是一个好的答案,但这是事实:异步异常是不安全的。您可能应该考虑在相关页面中运行一个计时器,该计时器可以以更安全的方式取消请求,它不会位于 CreateFile 的中间。
    【解决方案2】:

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

    【讨论】:

    • 是的,它发生在内部框架代码以及缓存的文件依赖项中。
    猜你喜欢
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多