File.ReadAllLinesAsync()
会阻塞UI线程异步方法理想情况下在返回待处理任务之前执行最少的同步工作。 然而,File.ReadAllLinesAsync()
并不总是遵循这种最佳实践。
问题:
该方法可能会在异步操作实际开始之前意外地阻塞 UI 线程相当长的一段时间。
最初的误解:
最初假设阻塞源于文件系统操作固有的同步性质。 然而,测试表明线程在发生任何文件访问之前阻塞。
真正的问题:
File.ReadAllLinesAsync()
的实现并未完全拥抱异步原则。它在移交任务之前执行大量同步预处理。
推荐解决方案:
为了防止 UI 线程阻塞,请使用 File.ReadAllLines()
包裹的同步 Task.Run()
方法进行异步执行:
<code class="language-csharp">var lines = await Task.Run(() => File.ReadAllLines(@"D:\temp.txt"));</code>
性能比较:
使用 6MB 文件进行的测试显示 File.ReadAllLinesAsync()
在返回未完成的任务之前阻塞了大约 450 毫秒(然后在 5 毫秒内完成)。 相反,当通过 Task.Run()
异步运行时,同步方法的延迟可以忽略不计。
.NET 6 及更高版本:
虽然 .NET 6 为 File.ReadAllLinesAsync()
带来了性能改进,但在异步使用时它仍然比同步方法慢,并且没有完全展现真正的异步行为。 因此,将 Task.Run()
与同步方法结合使用仍然是获得最佳 UI 响应能力的建议方法。
以上是尽管是异步的,为什么'File.ReadAllLinesAsync()”会阻塞 UI 线程?的详细内容。更多信息请关注PHP中文网其他相关文章!