Task.Factory.StartNew vs Async methods
本文关键字:Async methods vs StartNew Factory Task | 更新日期: 2023-09-27 17:57:44
这可能是一个微不足道的问题,但它可能有助于我的基本理解。
以下两种实现之间有什么重要区别吗?
-
Task.Factory.StartNew
:public Task<string> ReadAllTextAsync(string path) { return Task.Factory.StartNew(() => File.ReadAllText(path)); }
-
StreamReader
:上的异步方法public async Task<string> ReadAllTextAsync(string path) { using (var stream = File.OpenRead(path)) using (var reader = new StreamReader(stream)) { return await reader.ReadToEndAsync(); } }
是的,有一个关键的区别:Task.Factory.StartNew
没有保留同步上下文,而当使用async/await时,会保留此上下文。例如,在ASP.NET应用程序中,这意味着如果您使用Task.Factory.StartNew
,HttpContext可能无法在任务中访问,而如果您使用async/await,它将可用。
与您提供的示例还有另一个重要区别。在第一种情况下,您使用的是阻塞API:File.ReadAllText(path)
,而在第二种情况下使用的是带有真正异步I/O操作的I/O完成端口。这意味着,在第一种情况下,在执行此任务的整个过程中,您正在危及执行此任务所在的线程,而在第二种情况下由于I/O完成端口,此线程是空闲的。