ThreadAbortException di pegangan file bocor ASP.Net 4?

Kadang-kadang jika server file kita lambat dan halaman tidak selesai pada batas waktu habis, ASP.Net akan memukulnya dengan ThreadAbortException. Jika itu terjadi di dalam Win32Native.CreateFile, pegangan file akan terkunci sampai kita melakukan iisreset.

Apakah ini cacat pada .NET? Adakah yang bisa kita lakukan untuk mengatasi ide-ide buruk ini seperti menaikkan batas waktu ke angka yang sangat besar... Saya rasa ThreadAbort.Reset tidak akan membantu karena kerusakan sudah terjadi dan saya bahkan belum mengembalikan pegangan file dari FileStream untuk menutupnya sendiri.


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

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

di System.IO.FileStream.Init (jalur string, mode FileMode, akses FileAccess, hak Int32, Hak penggunaan Boolean, berbagi FileShare, bufferSize Int32, opsi FileOptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)

di System.IO.FileStream..ctor(Jalur string, mode FileMode, akses FileAccess, berbagi FileShare, bufferSize Int32, opsi FileOptions, String msgPath, Boolean bFromProxy)

di System.IO.FileStream..ctor (jalur string, mode FileMode)


person ss2k    schedule 25.04.2012    source sumber


Jawaban (2)


Sepertinya Anda juga mengirimkan pertanyaan ini ke Microsoft Connect dan tidak memperbarui jawabannya di sini:

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

Berikut tanggapan dari Microsoft:

Tidak disarankan melakukan operasi yang berjalan lama dalam permintaan sinkron di ASP.NET. Jika Anda mencapai periode batas waktu, Anda dapat memilih untuk menambah batas waktu permintaan yang dikonfigurasi atau mengubah menggunakan permintaan asinkron, yang tidak memiliki batas waktu selama eksekusi operasi asinkron, dan karenanya tidak memunculkan pengecualian pembatalan thread.

Saya kira pembatalan thread (atau pengecualian asinkron apa pun), dapat dan akan melakukan ini pada akhirnya.

Namun tampaknya kerangka kerja tersebut akan menggunakan SafeFileHandle secara internal dalam membuka file, jadi file tersebut harus ditutup oleh pengumpul sampah ketika ia dengan santai membukanya.

person Nick Whaley    schedule 30.07.2013
comment
Jawaban mereka tidak berguna mengingat ini adalah waktu tunggu di luar kendali saya. Bagian yang berjalan santai tidak berfungsi dengan baik dengan file terkunci di aplikasi web yang sibuk... - person ss2k; 21.10.2013
comment
@ ss2k Dimengerti. Tidak pernah mengatakan itu adalah jawaban yang bagus, tetapi itulah kenyataannya: pengecualian asinkron tidak aman. Anda mungkin harus mempertimbangkan untuk menjalankan pengatur waktu di halaman tersebut yang dapat membatalkan permintaan dengan cara yang lebih aman dan tidak akan berada di tengah-tengah CreateFile. - person Nick Whaley; 31.12.2013

Apakah Anda menutup file dengan benar dalam kode Anda dengan menutup klausa finally atau dengan menggunakan pendekatan using?

person tymtam    schedule 03.07.2013
comment
Ya dan itu terjadi dalam kode kerangka internal serta ketergantungan file untuk cache. - person ss2k; 13.02.2014