And*_*kin 24 c# task-parallel-library async-await
可能是一个微不足道的问题,但它可能有助于我的基本理解.
以下两个实现之间是否有任何重要区别?
Task.Factory.StartNew:
public Task<string> ReadAllTextAsync(string path) {
return Task.Factory.StartNew(() => File.ReadAllText(path));
}
Run Code Online (Sandbox Code Playgroud)异步方法StreamReader:
public async Task<string> ReadAllTextAsync(string path) {
using (var stream = File.OpenRead(path))
using (var reader = new StreamReader(stream)) {
return await reader.ReadToEndAsync();
}
}
Run Code Online (Sandbox Code Playgroud)Dar*_*rov 25
是的,有一个至关重要的区别:Task.Factory.StartNew不保留同步上下文,而在使用async/await时,会保留此上下文.例如,在ASP.NET应用程序中,这意味着如果您使用Task.Factory.StartNewHttpContext可能无法在任务内部访问,而如果您使用async/await,则它将可用.
您提供的示例还有另一个重要区别.在第一种情况下,您使用阻塞API:File.ReadAllText(path)而在第二种情况下,您正在使用具有真正异步I/O操作的I/O完成端口.这意味着在第一种情况下,您正在危害此任务在执行此任务期间执行的线程,而在第二种情况下,由于I/O完成端口,此线程是免费的.