Task.Factory.StartNew vs Async方法

And*_*kin 24 c# task-parallel-library async-await

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

以下两个实现之间是否有任何重要区别?

  1. Task.Factory.StartNew:

    public Task<string> ReadAllTextAsync(string path) {
        return Task.Factory.StartNew(() => File.ReadAllText(path));
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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();
        }
    }
    
    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完成端口,此线程是免费的.

  • 在更深入地研究了这个问题之后,我进一步**确信这个答案可能会误导他人。它确实指出了实现1和实现2的差异,但这不是异步/等待模式与使用Task.Factory.StartNew之间的根本差异。读者很容易将这个答案误解为一个解释Tasks和asyncs(特别是给出问题标题)之间基本区别的答案。@DarinDimitrov-我建议您进行编辑以明确区分。我会自己进行编辑,但是如果您的代表更高,请多加感谢。 (2认同)
  • @Snixtor,根据你的根本区别是什么?随意编辑我的答案.如果我不同意您的修改,我会将其还原. (2认同)