2017-04-27 22 views
1

在.NET核心Controller可以返回Ok()作爲IActionResult。但我不明白怎麼還可以返回Task<IActionResult>如何確定()是兩個任務<IActionResult>和IActionResult?

實施例:

public class FooController : Controller 
    { 

     [HttpGet] 
     public async Task<IActionResult> OkResultAsync() 
     { 
      // This is ok. But I don't get why since OkResult != Task<IActionResult> 
      OkResult result = Ok(); 
      return result; 
     } 

     [HttpGet] 
     public IActionResult OkResult() 
     { 
      // This is ok, and it seems logical since OkResult implements IActionResult. 
      OkResult result = Ok(); 
      return result; 
     } 

     [HttpGet] 
     public FooResult Bar() 
     { 
      // This is ok. 
      return new FooResult(); 
     } 

     [HttpGet] 
     public async Task<FooResult> BarAsync() 
     { 
      // This is not ok since FooResult != Task<FooResult> 
      return new FooResult(); 
     } 
    } 

Ok()返回OkResult,這又實現IActionResult。 .NET是如何知道如何處理它(無等待),如果該方法簽名返回一個Task<IActionResult>

+2

'async-await'是編譯器功能,它爲異步執行生成代碼。所以,如果你標記方法'async'編譯器將包裹返回值'任務' – Fabio

回答

4

async關鍵字使編譯器自動照顧這一點。異步方法隱式地「包裝」了任務中的返回值。

async Task<int> GetNumber() 
{ 
    return 42; 
} 

VS

Task<int> GetNumber() 
{ 
    return Task.FromResult(42); 
} 
+0

感謝。但是爲什麼在示例中沒有'BarAsync'工作? – smoksnes

+0

@smoksnes它如何「不起作用」? – spender

+0

我一定做了一個type-o。它確實有效。 – smoksnes

1

async關鍵字是一個封裝在一個任務的方法的內容的簡寫。當你在一個異步方法中返回時,編譯器會將它包裝成一個Task給你。例如,這兩種方法實質上是相同的:

private static Task<string> Hello() 
{ 
    return new Task<string>(() => "hello"); 
} 

private static async Task<string> AsyncHello() 
{ 
    return "hello"; 
} 
相關問題