c# - Task.Factory.StartNew 与异步方法

标签 c# task-parallel-library async-await

这可能是一个微不足道的问题,但它可能有助于我的基本理解。

以下两个实现之间有什么重要区别吗?

  1. Task.Factory.StartNew:

    public Task<string> ReadAllTextAsync(string path) {
        return Task.Factory.StartNew(() => File.ReadAllText(path));
    }
    
  2. 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 完成端口,该线程是空闲的。

关于c# - Task.Factory.StartNew 与异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14682513/

相关文章:

c# - 是否可以在 if 条件下使用 Task<bool> ?

c# - .NET Task 实例能否在运行期间超出范围?

javascript - 有没有办法在等待 API 数据时不停止进度条?

typescript - Typescript 中的链接 Promise

c# - 用于索尼相机的 USB 远程相机控制 API/SDK

c# - 是否可以使用 C# 语言的 SSIS 脚本任务在 Excel 工作表中创建下拉列?

c# - 与 ASP Net MVC 应用程序一起使用的 Entity Framework 术语

c# - 如何使用 Xpath 获取所有节点属性和值?

c# - Task.WhenAll - 何时使用它

c# - CS1998如何实现不警告的同步任务返回方法?