2013-02-04 68 views
19

可能是一個微不足道的問題,但它可能有助於我的基本理解。Task.Factory.StartNew vs異步方法

以下兩種實現有什麼重要區別嗎?

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

回答

22

是的,有一個關鍵的區別:當使用而Task.Factory.StartNew不保留同步上下文異步/等待此上下文被保留。例如,在ASP.NET應用程序中,這意味着如果您使用Task.Factory.StartNew,HttpContext可能無法在任務內部訪問,而如果您使用異步/等待,它將可用。

您提供的示例還有另一個重要的區別。在第一種情況下,您使用的是阻塞API:File.ReadAllText(path),而在第二種情況下,您正在使用具有真正異步I/O操作的I/O完成端口。這意味着在第一種情況下,您會在執行此任務的整個過程中危害執行此任務的線程,而在第二種情況下,由於I/O完成端口,此線程可以空閒。

+1

@dtb,在處理任務時,我們無法真正討論ThreadPool。第一個例子是阻塞執行任務的線程,而在第二個例子中沒有。我已經更新了我的答案以包含此信息。 –

+2

+1。好的回答 – dtb

+1

謝謝,澄清了它(特別是第二點,我懷疑IO有一些低效率)。 –