Mengatasi Penyekatan Benang UI dalam Operasi I/O Fail Asynchronous
Matlamat pengaturcaraan tak segerak dalam aplikasi GUI adalah untuk menghalang sekatan benang UI, memastikan pengalaman pengguna yang responsif. Walau bagaimanapun, dalam .NET Core 3.1 dan versi terdahulu, API sistem fail tak segerak tidak sentiasa mematuhi amalan terbaik.
Secara khusus, File.ReadAllLinesAsync()
boleh menyekat urutan UI, walaupun reka bentuknya tidak segerak. Ini kerana kaedah itu tidak mematuhi sepenuhnya corak tak segerak yang disyorkan: kerja segerak yang minimum sebelum mengembalikan tugas.
Untuk memintas isu ini dalam versi .NET yang lebih lama, elakkan menggunakan API sistem fail tak segerak terus dalam aplikasi GUI. Sebaliknya, masukkan API segerak dalam Task.Run()
. Contohnya:
var lines = await Task.Run(() => File.ReadAllLines(@"D:\temp.txt"));
Pemerhatian Prestasi:
Ujian mendedahkan tingkah laku menyekat File.ReadAllLinesAsync()
. Memproses fail 6MB pada SSD menghasilkan blok benang UI 450 milisaat sebelum tugasan yang tidak lengkap dikembalikan dalam versi .NET yang lebih lama.
.NET 6 Penambahbaikan:
.NET 6 membawa peningkatan pada API sistem fail tak segerak, dengan ketara mengurangkan masa penyekatan kepada kira-kira 19 milisaat. Walau bagaimanapun, API tak segerak ini kekal lebih perlahan (kira-kira dua kali ganda kelajuan) daripada rakan sejawat segeraknya dan tidak tak segerak sepenuhnya. Oleh itu, menggunakan API segerak yang dibalut dengan Task.Run()
kekal sebagai pendekatan yang disyorkan untuk prestasi optimum dan responsif UI.
Atas ialah kandungan terperinci Mengapa Operasi I/O Fail Async Masih Menyekat Benang UI dalam .NET (dan Cara Membetulkannya)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!