ThreadAbortException ในตัวจัดการไฟล์รั่วไหลของ ASP.Net 4?

ในบางครั้งหากไฟล์เซิร์ฟเวอร์ของเราช้าและเพจไม่เสร็จภายในเวลาที่กำหนด ASP.Net จะโจมตีด้วย ThreadAbortException หากสิ่งนั้นเกิดขึ้นภายใน Win32Native.CreateFile ไฟล์จะถูกล็อคตัวจัดการไฟล์ไว้จนกว่าเราจะทำการรีเซ็ต

นี่เป็นข้อบกพร่องใน .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, สิทธิ์การใช้งานบูลีน, การแชร์ FileShare, ขนาดบัฟเฟอร์ Int32, ตัวเลือก FileOptions, SECURITY_ATTRIBUTES secAttrs, สตริง msgPath, บูลีน bFromProxy, บูลีน useLongPath)

ที่ System.IO.FileStream..ctor (เส้นทางสตริง, โหมด FileMode, การเข้าถึง FileAccess, การแชร์ FileShare, Int32 bufferSize, ตัวเลือก FileOptions, สตริง msgPath, บูลีน bFromProxy)

ที่ System.IO.FileStream..ctor (เส้นทางสตริง โหมด FileMode)




คำตอบ (2)


ดูเหมือนว่าคุณส่งคำถามนี้ไปยัง Microsoft Connect ด้วยและไม่ได้อัปเดตที่นี่พร้อมคำตอบ:

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

นี่คือคำตอบจาก Microsoft:

ไม่แนะนำให้ทำการดำเนินการที่ใช้เวลานานในการร้องขอแบบซิงโครนัสใน ASP.NET หากคุณกำลังเข้าสู่ช่วงหมดเวลา คุณสามารถเลือกที่จะเพิ่มการหมดเวลาของคำขอที่กำหนดค่าไว้หรือเปลี่ยนเป็นการใช้คำขอแบบอะซิงโครนัส ซึ่งจะไม่หมดเวลาระหว่างการดำเนินการของการดำเนินการแบบอะซิงโครนัส และด้วยเหตุนี้อย่าโยนเธรดที่ยกเลิกข้อยกเว้น

ฉันเดาว่าการยกเลิกเธรด (หรือข้อยกเว้นแบบอะซิงโครนัสสำหรับเรื่องนั้น) สามารถและจะทำสิ่งนี้ได้ในที่สุด

แต่ดูเหมือนว่าเฟรมเวิร์กจะใช้ SafeFileHandle ภายในในการเปิดไฟล์ ดังนั้นจึงควรปิดโดยตัวรวบรวมขยะเมื่อมันเข้ามาใกล้ ๆ

person Nick Whaley    schedule 30.07.2013
comment
คำตอบของพวกเขาไม่มีประโยชน์เนื่องจากสิ่งนี้อยู่นอกเหนือการควบคุมของฉัน ส่วนการใช้งานแบบสบาย ๆ นั้นทำงานได้ไม่ดีนักกับไฟล์ที่ถูกล็อคในเว็บแอปพลิเคชันที่ไม่ว่าง ... - person ss2k; 21.10.2013
comment
@ss2k เข้าใจแล้ว ไม่เคยบอกว่ามันเป็นคำตอบที่ดี แต่มันคือความจริง: ข้อยกเว้นแบบอะซิงโครนัสนั้นไม่ปลอดภัย คุณควรพิจารณาเรียกใช้ตัวจับเวลาในหน้าที่เป็นปัญหาซึ่งสามารถยกเลิกคำขอได้อย่างปลอดภัยยิ่งขึ้น โดยที่จะไม่อยู่ตรงกลางของ CreateFile - person Nick Whaley; 31.12.2013

คุณปิดไฟล์อย่างถูกต้องในโค้ดของคุณโดยปิดในส่วนคำสั่ง finally ของคุณหรือโดยใช้วิธี using

person tymtam    schedule 03.07.2013
comment
ใช่ และมันเกิดขึ้นในโค้ดเฟรมเวิร์กภายใน เช่นเดียวกับการขึ้นต่อกันของไฟล์สำหรับแคช - person ss2k; 13.02.2014