Rumah >pembangunan bahagian belakang >C++ >Mengapa File.ReadAllLinesAsync() Menyekat Benang UI dalam Aplikasi WPF?

Mengapa File.ReadAllLinesAsync() Menyekat Benang UI dalam Aplikasi WPF?

Barbara Streisand
Barbara Streisandasal
2025-01-20 15:01:10436semak imbas

Why Does File.ReadAllLinesAsync() Block the UI Thread in WPF Applications?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn