Task.Factory.StartNew vs Async方法

时间:2013-02-04 07:57:57

标签: 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();
        }
    }
    

1 个答案:

答案 0 :(得分:24)

是的,有一个至关重要的区别:Task.Factory.StartNew不保留同步上下文,而在使用async / await时,会保留此上下文。例如,在ASP.NET应用程序中,这意味着如果使用Task.Factory.StartNew,则可能无法在任务内访问HttpContext,而如果使用async / await,则可以使用它。

您提供的示例还有另一个重要区别。在第一种情况下,您使用的是阻塞API:File.ReadAllText(path)而在第二种情况下,您使用的I / O完成端口具有真正的异步I / O操作。这意味着在第一种情况下,您正在危害此任务在执行此任务期间执行的线程,而在第二种情况下,由于I / O完成端口,此线程是免费的。