Während File.ReadAllLinesAsync()
in .NET (Versionen 3.1 und höher) auf nicht blockierendes Verhalten abzielt, kann es unter bestimmten Bedingungen überraschenderweise den UI-Thread blockieren.
In WPF-Anwendungen kann die Verwendung von File.ReadAllLinesAsync()
zum Einfrieren der Benutzeroberfläche führen. Dies ist auf Inkonsistenzen bei der Implementierung von APIs für den asynchronen Dateizugriff zurückzuführen. Die Richtlinien von Microsoft schlagen vor, dass asynchrone Methoden nach minimaler synchroner Arbeit ein Task
zurückgeben sollten. File.ReadAllLinesAsync()
weicht davon ab, was zu einer längeren Blockierung führt, bevor ein unvollständiges Task
zurückgegeben wird.
Die empfohlene Problemumgehung besteht darin, die synchrone File.ReadAllLines()
-Methode innerhalb von Task.Run()
zu verwenden. Dadurch wird das Lesen der Datei in einen Hintergrundthread verlagert, wodurch ein Einfrieren der Benutzeroberfläche verhindert wird.
Tests beim Lesen einer 6-MB-Datei mit File.ReadAllLinesAsync()
ergaben eine erhebliche UI-Blockade von etwa 450 Millisekunden – eine klare Abweichung vom erwarteten asynchronen Verhalten.
Selbst mit Verbesserungen bei der asynchronen Datei-E/A von .NET 6 bleiben File.ReadAllLinesAsync()
Leistungseinschränkungen bestehen. Es ist erheblich langsamer (ungefähr doppelt so lang) als sein synchrones Gegenstück und nicht vollständig asynchron. Daher bleibt die Verwendung der synchronen Version innerhalb von Task.Run()
die beste Vorgehensweise, bis weitere API-Optimierungen implementiert werden.
Das obige ist der detaillierte Inhalt vonWarum blockiert File.ReadAllLinesAsync() manchmal den UI-Thread in .NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!