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
Lepaskan: 2025-01-20 15:01:10
asal
448 orang telah melayarinya

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:

private async void Button_OnClick(object sender, RoutedEventArgs e)
{
    Button.Content = "Loading...";
    var lines = await File.ReadAllLinesAsync("D:\temp.txt"); // 阻塞 UI 线程
    Button.Content = "Show";
}
Salin selepas log masuk

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:

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;
Salin selepas log masuk

Output

<code>创建: 450 毫秒, Task.IsCompleted: False
等待: 5 毫秒, 行数: 204,000</code>
Salin selepas log masuk

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.

      var lines = await Task.Run(() => File.ReadAllLines("LargeFile.txt"));
    Salin selepas log masuk
  • 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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan