通常情况下,如果我们的文件服务器速度慢,并且页面没有在超时之前完成,ASP.Net就会用一个ThreadAbortException来点击它。如果这种情况发生在Win32Native.CreateFile内部,它会将文件句柄锁定,直到我们完成iis重置。
这是.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)
在System.IO.FileStream.Init(字符串路径、FileMode模式、FileAccess访问、Int32权限、布尔useRights、FileShare共享、Int32 bufferSize、FileOptions选项、SECURITY_ATTRIBUTES secAttrs、String msgPath、布尔bFromProxy、布尔useLongPath)
在System.IO.FileStream..ctor(字符串路径、FileMode模式、FileAccess访问、FileShare共享、Int32 bufferSize、FileOptions选项、字符串msgPath、布尔bFromProxy)
在System.IO.FileStream..ctor(字符串路径,FileMode模式)
发布于 2013-07-30 19:29:32
看起来您也向Microsoft提交了这个问题,并且没有在这里更新它们的答案:
http://connect.microsoft.com/VisualStudio/feedback/details/739044/threadabortexception-in-asp-net-4-during-new-filestream-leaking-file-handle
以下是微软的回应:
不建议
在ASP.NET中的同步请求中执行长时间运行操作。如果您正处于超时期间,您可以选择简单地增加已配置的请求超时,或者更改为使用异步请求,异步请求在执行异步操作时不会超时,因此不会抛出线程中止异常。
我猜线程中止(或任何异步异常),最终能够并将这样做。
但是框架在内部打开文件时似乎会使用SafeFileHandle,所以当垃圾收集器悠闲地接近它时,它应该被关闭。
发布于 2013-07-03 02:46:41
您是通过在finally子句中使用close还是使用using方法来正确地关闭代码中的文件?
https://stackoverflow.com/questions/10323058
复制相似问题