2017-01-04 28 views
2

My Understading:async如何在ASP.NET web應用程序中工作?

異步與線程不同。在Async中,我們使用單個線程並可以從中運行多個任務。在.Net framework中,我們有一個線程池,它在每個新的http web請求上分配一個新的線程。所以每個請求都由一個線程處理。但是,IIS沒有自己的線程池,它使用CLR的線程池。

如果我們在web請求中創建任何新的附加線程,那麼我們從線程池中丟失一個線程,並且如果您的站點有很多流量,那麼您的站點用戶有 等待,直到任何線程獲得空閒。所以最好在ASP.Net應用程序中使用異步任務。異步任務將在執行主要Web請求的單線程中執行。

async如何工作。假設我們在控制器中創建兩個獨立/異步任務,假設它們是T1和T2。 T1執行一段時間間隔,然後執行T2。然後再次主要的Web請求。他們通過使用時間片來使用CPU。

Web Request -----> Single Thread Pool Thread (Main Request + T1 +T2) 
    => 
    Execution Lifecycle --> [Main request, T1, T2, T1, Main Request, T2, T1.....] 

,如果我們使用await Task.WhenAll然後我們的主線程被釋放,並返還給線程池,一旦所有的任務完成,我們給予 我們的線程回來繼續。

首先,清楚我的概念,如果我哪裏錯了?

然後,我有幾個困惑:

  1. 如果我們的線程給線程池,然後該線程將工作 賴以在WhenAll任務。
  2. WhenAll完成後我們是否給予相同的線程 或者我們隨機給出一個新的線程?
+4

[沒有線程](http://blog.stephencleary.com/2013/11/there-is-no-thread.html) –

+0

爲什麼你在乎'哪個'線程?如果線程被重新使用,它是否會計數'相同'線程?我認爲這其中的一點是要抽象這些細節,以便您不必在意...... – Milney

+0

看起來您似乎將ASP'SynchronizationContext'實現以某種方式等同於實現WPF或Winforms實現。這不完全相同。 – Gusdor

回答

9

他們使用CPU使用時間分片。

這是你錯了的地方。 主題通過時間分片共享CPU。任務是完全不同的。

有兩種任務:委託任務和承諾任務。委託任務將在一個線程上執行 - 他們實際上有要運行的代碼,所以他們必須使用CPU。但是,委託任務在異步代碼中非常少見,一般不應該在ASP.NET上使用。

承諾任務是絕大多數異步代碼使用的。承諾任務只是代表某種「完成」。對於絕大多數他們的工作,他們做而不是執行代碼,並且不需要CPU。有關這可能性的更多信息,請參閱我的博客文章There Is No Thread

如果我們的線程被提供給線程池,那麼哪個線程將處理WhenAll中的任務。

沒有線程是必要的。這是在ASP.NET上使用異步代碼的關鍵。

當我們完成任務或我們被隨機給出一個新的線程後,我們是否返回相同的線程?

它是線程池中的一個線程,它可能與您開始的線程池相同或不同。爲此,使用[ThreadStatic]等會導致問題。

有關async如何工作的更多信息,我建議閱讀我的async intro和我的文章async ASP.NET。有關這兩種類型的任務的更多信息,我建議閱讀我的Task overviewTask status博客文章。

+0

「可能與您開始的可能是同一個,也可能不是同一個」:對,我已經很難了解到這一點:我們已經向Web應用程序添加了異步處理,並且我已經瞭解到在等待處理可以繼續一個新的線程。不幸的是WebOperationContext.Current在另一個線程中無效 - 或者至少在.NET 4.6.2版本中修復之前就是這種情況! –

+0

我會讀出你的博客和書籍,深入瞭解.NET中的併發性。你是冠軍..謝謝很多:) –

+0

@Stephen - 你可以請回答這個 - https://stackoverflow.com/questions/47239986/queries-regarding-asynchronous-programming-in-aspnet –

相關問題