File.ReadAllLinesAsync()
Boleh Menyekat Benang UIKaedah tak segerak idealnya melakukan kerja segerak yang minimum sebelum mengembalikan tugas yang belum selesai. Walau bagaimanapun, File.ReadAllLinesAsync()
tidak selalu mengikut amalan terbaik ini.
Isunya:
Kaedah ini boleh menyekat urutan UI secara tidak dijangka untuk tempoh yang agak lama sebelum operasi tak segerak benar-benar bermula.
Salah Tanggapan Awal:
Adalah pada mulanya diandaikan bahawa penyekatan itu berpunca daripada sifat segerak dalam operasi sistem fail. Ujian, bagaimanapun, menunjukkan bahawa benang menyekat sebelum sebarang akses fail berlaku.
Masalah Sebenar:
Pelaksanaan File.ReadAllLinesAsync()
tidak merangkumi prinsip tak segerak sepenuhnya. Ia melakukan sejumlah besar pra-pemprosesan segerak sebelum menyerahkan tugas.
Penyelesaian Disyorkan:
Untuk mengelakkan sekatan benang UI, gunakan kaedah File.ReadAllLines()
segerak yang dibalut dengan Task.Run()
untuk pelaksanaan tak segerak:
<code class="language-csharp">var lines = await Task.Run(() => File.ReadAllLines(@"D:\temp.txt"));</code>
Perbandingan Prestasi:
Ujian menggunakan fail 6MB menunjukkan File.ReadAllLinesAsync()
menyekat selama lebih kurang 450 milisaat sebelum mengembalikan tugas yang tidak lengkap (yang kemudiannya selesai dalam 5 milisaat). Sebaliknya, kaedah segerak, apabila dijalankan secara tak segerak melalui Task.Run()
, menunjukkan kelewatan yang boleh diabaikan.
.NET 6 dan Seterusnya:
Walaupun .NET 6 membawa peningkatan prestasi kepada File.ReadAllLinesAsync()
, ia kekal lebih perlahan daripada pendekatan segerak apabila digunakan secara tak segerak dan tidak mempamerkan kelakuan tak segerak sebenar sepenuhnya. Oleh itu, menggunakan Task.Run()
dengan kaedah segerak kekal sebagai pendekatan yang dicadangkan untuk responsif UI yang optimum.
Atas ialah kandungan terperinci Mengapakah `File.ReadAllLinesAsync()` Menyekat Benang UI Walaupun Menjadi Asynchronous?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!