虽然 .NET(版本 3.1 及更高版本)中的 File.ReadAllLinesAsync()
旨在实现非阻塞行为,但在特定条件下它可能会令人惊讶地阻塞 UI 线程。
在 WPF 应用程序中,使用 File.ReadAllLinesAsync()
可能会冻结 UI。这是由于异步文件访问 API 的实现方式不一致造成的。 Microsoft 的指南建议异步方法应在最少的同步工作后返回 Task
。 File.ReadAllLinesAsync()
偏离了这一点,导致在返回不完整的 Task
之前长时间阻塞。
建议的解决方法是在 File.ReadAllLines()
中使用同步 Task.Run()
方法。这会将文件读取任务卸载到后台线程,从而防止 UI 冻结。
使用 File.ReadAllLinesAsync()
读取 6MB 文件的测试显示,UI 出现了大约 450 毫秒的严重阻塞 – 明显偏离了预期的异步行为。
即使改进了 .NET 6 的异步文件 I/O,File.ReadAllLinesAsync()
仍然存在性能限制。 它比同步版本慢得多(大约是时间的两倍),并且不是完全异步的。 因此,在实现进一步的 API 优化之前,在 Task.Run()
中使用同步版本仍然是最佳实践。
以上是为什么 File.ReadAllLinesAsync() 有时会阻塞 .NET 中的 UI 线程?的详细内容。更多信息请关注PHP中文网其他相关文章!