Heim >Backend-Entwicklung >C++ >Warum blockiert „File.ReadAllLinesAsync()' den UI-Thread, obwohl er asynchron ist?
File.ReadAllLinesAsync()
den UI-Thread blockieren kannAsynchrone Methoden führen im Idealfall nur minimale synchrone Arbeit aus, bevor sie eine ausstehende Aufgabe zurückgeben. File.ReadAllLinesAsync()
befolgt diese Best Practice jedoch nicht immer.
Das Problem:
Die Methode kann den UI-Thread unerwartet für eine beträchtliche Dauer blockieren, bevor der asynchrone Vorgang tatsächlich beginnt.
Anfängliches Missverständnis:
Anfänglich wurde angenommen, dass die Blockierung auf die inhärent synchrone Natur von Dateisystemvorgängen zurückzuführen ist. Tests haben jedoch gezeigt, dass der Thread blockiert, bevor ein Dateizugriff erfolgt.
Das eigentliche Problem:
Die Implementierung von File.ReadAllLinesAsync()
berücksichtigt asynchrone Prinzipien nicht vollständig. Es führt einen erheblichen Teil der synchronen Vorverarbeitung durch, bevor die Aufgabe übergeben wird.
Empfohlene Lösung:
Um eine Blockierung des UI-Threads zu verhindern, verwenden Sie die synchrone File.ReadAllLines()
-Methode, die in Task.Run()
für die asynchrone Ausführung eingeschlossen ist:
<code class="language-csharp">var lines = await Task.Run(() => File.ReadAllLines(@"D:\temp.txt"));</code>
Leistungsvergleich:
Tests mit einer 6-MB-Datei zeigten File.ReadAllLinesAsync()
eine Blockierung für etwa 450 Millisekunden, bevor eine unvollständige Aufgabe zurückgegeben wurde (die dann in 5 Millisekunden abgeschlossen wurde). Umgekehrt zeigte die synchrone Methode bei asynchroner Ausführung über Task.Run()
eine vernachlässigbare Verzögerung.
.NET 6 und höher:
Während .NET 6 Leistungsverbesserungen für File.ReadAllLinesAsync()
mit sich brachte, bleibt es bei asynchroner Verwendung langsamer als der synchrone Ansatz und zeigt nicht vollständig echtes asynchrones Verhalten. Daher bleibt die Verwendung von Task.Run()
mit der synchronen Methode der empfohlene Ansatz für eine optimale Reaktionsfähigkeit der Benutzeroberfläche.
Das obige ist der detaillierte Inhalt vonWarum blockiert „File.ReadAllLinesAsync()' den UI-Thread, obwohl er asynchron ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!