2017-08-10 122 views
0

我問了一個問題,今天How can I run a method without waiting for long running process,我得到了一個很好的答案和Ajax解決我的問題。 但現在我的問題是爲什麼我仍然應該使用異步等待關鍵字?混淆異步等待在MVC

public async Task<ActionResult> DoSomeAsyncStuff() 
{ 
    var model = new MyModel(); 
    await Task.Delay(20000);//My long-running process is getting data from an API with "HttpWebRequest". 

    model.Name = "Something"; 
    //Assigning other model properties 

    return PartialView("_InnerView", model); 
} 

是不是異步await關鍵字,以避免阻止用戶界面?但在網絡中,我看不到任何阻礙用戶界面,在我的情況下,不像WinForms。上面的代碼和ajax工作得很好,即使沒有異步等待關鍵字。所以有人可以解釋爲什麼我應該使用它們以及它們的用法是什麼?

+0

在一般的方式:'ajax'是'客戶side'和'異步/ wait'是'服務器side'與異步操作的工作方式。閱讀完整的解釋[這裏](https://stackoverflow.com/questions/26978034/difference-between-ajax-helper-and-async-await) –

+0

@ChristianGollhardt我的問題是關於他們在網站上的好處而不是應用程序。在網絡中,我看不到任何攔截用戶界面問題。所以我的問題不同於重複的問題。 – SteveCode

+0

@SteveCode的區別在哪裏?即使Ajax也可以從並行處理中受益。 –

回答

0

如果我沒有記錯的異步,在這種情況下,讓你處理服務器上更多的要求:當你有延遲(從SQL數據等待FS?),另一個請求可以被接受並開始循環。

+1

實際上,當您等待時,該線程將被釋放,並且將被髮送回線程池。因此,任何其他請求可以使用.. –

+0

謝謝@PowerStar,這正是我會想說,或許我沒有說清楚:) – LoreX75

+0

@PowerStar當你等待,該線程將被釋放,它將被髮送回到線程池。所以等待的任務運行時線程被釋放? – SteveCode

0

原因請求是異步是允許關於UI多個請求由單個線程來處理,而不是什麼(A服務器並沒有真正有一個UI畢竟,它只是返回的一些文件或數據時尚)。如果該方法是同步的,那麼處理此請求的線程將在您等待時被阻止,並且如果您一次收到大量請求,則可以快速提高您使用的線程數。由於線程確實會帶來一些開銷,因此可能會對服務器的性能產生負面影響。

通過使用異步/ AWAIT,該線程被釋放到處理在同一時間的另一請求,其既更快和不僅僅是阻塞線程一會兒有效得多。在你的例子中,一個線程可以同時處理DoSomeAsyncStuff()的多個調用 - 當它遇到await Task.Delay(20000);時,可以處理另一個請求,或者從之前命中的await或從方法的開始恢復。

+0

該線程被釋放以同時處理另一個請求。所以等待的任務運行時線程被釋放? – SteveCode

+0

等待完成的任務完成後,如果原始線程正在被另一個請求使用,它將恢復其原始線程或線程池中的另一個線程。 –

+0

謝謝,但我的問題是當等待完成的任務在完成這個過程中它應該使用一些線程完成。不?如果系統不關心,那麼等待的過程將如何完成。它不應該運行在一個線程或類似的東西至少?我想知道它在哪裏運行,直到它完成? – SteveCode