2016-09-19 95 views
1

我仍然試圖讓我的頭在如何以及何時在asp.net中使用async方法,並且我可以詢問關於它的一打問題,但這種行爲令我感到驚訝......從我讀過的所有東西,如果我創建一個async方法,但將其聲明爲void,然後不等待它,它本質上就好像您只是在工作線程上運行該異步代碼而不掛起來獲取結果。也就是說,空白會立即返回給調用者,調用者會去執行業務,並且可能在方法執行之前完成。但在我的.net核心應用程序中,絕對不是這種情況。我有一個async void,我從另一個異步方法調用,雖然我不await線程塊async代碼。這裏發生了什麼事?ASPNET核心和異步執行

謝謝。

+0

另外我還在玩它 - 現在我不能得到任何'任務'在後臺運行,無論? – user2403744

回答

7

我仍然在試圖讓我圍繞如何以及何時使用異步方法在asp.net頭

你會使用它們時:

  1. 你有異步工作去做。一般來說,這意味着I/O綁定,而不是CPU綁定。
  2. 您的後端比例。例如,它是一個WebAPI,NoSQL服務,SQL Server集羣等。如果您的後端是單個SQL Server實例,則它不具有可伸縮性,並且在Web層上使用異步是沒有意義的。

它本質上是因爲如果你只是跑了一個工作線程

async void號是異步代碼只是可防止呼叫者它完成時檢測。它仍然在與調用者相同的上下文中運行,就像async Task方法一樣。

在異步代碼

這可能是因爲你的「異步」的代碼實際上是同步的線程塊。如果它沒有await,那麼編譯器會警告你它是同步的。


你會發現我的intro to async博客文章和async on ASP.NET MSDN文章很有幫助。至於async,ASP.NET核心只改變了幾件事情:1)沒有更多的ASP.NET請求上下文,2)整個管道是異步兼容的,所以諸如異步過濾器和異步視圖組件之類的東西就可以工作。

+0

好的,那太好了。我猜是什麼讓我失望是因爲我很早就讀到「等待」與線程沒有任何關係,但正如我所看到的那樣,並非如此:在某些時刻,你明顯將工作轉移到另一線程如果你說當前線程在等待執行時沒有被阻塞。也就是說,awaitable正在某個線程中執行,而不是它被調用的線程。所以我想有些線程比別人更有價值,可以這麼說嗎?因爲這一點,真的嗎? – user2403744

+0

@ user2403744:否;對於真正的異步代碼,[沒有線程](http://blog.stephencleary.com/2013/11/there-is-no-thread.html)。 –

+0

grrr,好的。我今晚會去兔洞,並說服我自己已經知道的事實:你是對的。它會讓我的大腦受傷,我只知道它。 – user2403744