Rumah >pembangunan bahagian belakang >C++ >Mengapa File.ReadAllLinesAsync() Menyekat Benang UI dalam Aplikasi WPF?
Terangkan misteri: File.ReadAllLinesAsync()
Mengapa urutan UI WPF disekat
Pengenalan
Apabila menggunakan pengaturcaraan tak segerak dalam WPF, adalah penting untuk memahami sebab kaedah tertentu menyekat urutan UI. File.ReadAllLinesAsync()
ialah salah satu kaedah yang tingkah lakunya yang tidak dijangka menimbulkan persoalan dalam kalangan pembangun. Artikel ini akan menyelidiki sebab di sebalik isu ini dan meneroka kemungkinan penyelesaian.
Soalan
File.ReadAllLinesAsync()
ialah kaedah tak segerak untuk mendapatkan semula kandungan fail teks secara tak segerak. Walau bagaimanapun, dalam aplikasi WPF, menggunakan kaedah ini boleh menyebabkan urutan UI disekat, seperti yang ditunjukkan dalam coretan kod berikut:
<code class="language-csharp">private async void Button_OnClick(object sender, RoutedEventArgs e) { Button.Content = "Loading..."; var lines = await File.ReadAllLinesAsync("D:\temp.txt"); // 阻塞 UI 线程 Button.Content = "Show"; }</code>
Penjelasan
File.ReadAllLinesAsync()
Sebab untuk menyekat urutan UI adalah disebabkan oleh pelaksanaan dalaman operasi fail tak segerak dalam .NET Core 3.1. Bertentangan dengan prinsip reka bentuk yang disyorkan untuk kaedah tak segerak, kaedah ini melakukan banyak kerja segerak sebelum mengembalikan tugas. Penyegerakan ini termasuk memulakan akses fail, memperuntukkan memori dan memuatkan kandungan fail ke dalam memori. Oleh itu, urutan UI disekat semasa melaksanakan tugasan ini.
Impak prestasi
Untuk menggambarkan kesan prestasi isu ini, kami boleh menjalankan ujian mudah yang melibatkan pembacaan fail teks yang besar. Keputusan (dalam milisaat) adalah seperti berikut:
<code class="language-csharp">Task<string> task = File.ReadAllLinesAsync("LargeFile.txt"); long duration1 = stopwatch.ElapsedMilliseconds; bool isCompleted = task.IsCompleted; stopwatch.Restart(); string[] lines = await task; long duration2 = stopwatch.ElapsedMilliseconds;</code>
Output
<code>创建: 450 毫秒, Task.IsCompleted: False 等待: 5 毫秒, 行数: 204,000</code>
Seperti yang anda boleh lihat daripada output, File.ReadAllLinesAsync()
menyekat urutan UI selama hampir setengah saat (450 milisaat) sebelum mengembalikan tugas yang tidak lengkap. Operasi await
seterusnya selesai dengan sangat cepat, hanya mengambil masa 5 milisaat.
Penyelesaian yang mungkin
Untuk menyelesaikan isu ini, pertimbangkan alternatif berikut:
Gunakan kaedah File.ReadAllLines()
segerak. Walaupun serentak, kaedah ini mengelak daripada menyekat urutan UI. Anda boleh memasukkan panggilannya Task.Run
untuk memastikan ia berjalan secara tidak segerak.
<code class="language-csharp"> var lines = await Task.Run(() => File.ReadAllLines("LargeFile.txt"));</code>
Pertimbangkan untuk menggunakan pustaka pihak ketiga dengan keupayaan akses fail tak segerak yang lebih cekap. Perpustakaan seperti System.IO.Pipelines
dan DotNetReactor.IO
direka untuk meningkatkan prestasi tak segerak dalam operasi fail.
Kesimpulan
Disebabkan ketidakcekapan pelaksanaan dalam .NET Core 3.1, File.ReadAllLinesAsync()
menyekat urutan UI dalam aplikasi WPF. Isu ini boleh memberi kesan negatif terhadap responsif UI. Dengan memanfaatkan penyelesaian pihak ketiga yang disegerakkan atau dioptimumkan, anda boleh mengelakkan potensi kesesakan ini dan memastikan pengalaman pengguna yang lancar.
Atas ialah kandungan terperinci Mengapa File.ReadAllLinesAsync() Menyekat Benang UI dalam Aplikasi WPF?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!