这两者有什么区别:
Task.Run(() => File.ReadAllText(path));
File.ReadAllTextAsync(path);
我希望第二种方法更快,当然,但一般来说,有什么安全原因我应该不使用第一种方法吗?我使用
File.ReadAllText
作为示例,但对我来说这个问题的重点是异步部分。
根据我对两者的理解,我会这样分类
File.ReadAllTextAsync(path);
执行非阻塞异步操作,立即返回可以等待的任务
Task.Run(() => File.ReadAllText(path));
执行同步阻塞操作,但将其从线程池中卸载到新线程
鉴于这些差异,很明显为什么
File.ReadAllTextAsync(path);
在发生许多 i/o 操作的情况下更好,因为 Task.Run(() => File.ReadAllText(path));
将保留一个线程直到操作完成。
总结
两种方法都会在主线程上执行非阻塞操作,区别在于
Task.Run(() => File.ReadAllText(path));
会在操作期间占用一个线程。