2015-10-27 44 views
0

我想提高我的web應用程序的對未來的可擴展性問題的表現,異步性的ASP MVC

一個場景,我想的是,如果我需要,需要從數據庫過濾列表。

這裏是草稿,我提出:

public IEnumerable<test> getL(IEnumerable<test> filter) 
{ 
     //do some filtering from the list then return it 
     return filter; 
} 



public async Task<ActionResult> Index() 
{ 
     context con = new context();  
     //do more stuff of stuff 
     IEnumerable<test> get = await Task.Run(() => { return getL(con.dep.ToList()); }); 
     return View(get); 
} 

我與C#的不同步,所以我還挺想知道如果我這樣做正確的還挺新。我是否正確啓動異步呼叫?

+0

這可能更適合https://codereview.stackexchange.com/?但是,代碼看起來爲我工作。數據庫任務完成時,將等待對「索引」的請求。根據您的數據庫訪問方法,您可能會等待調用數據庫。例如。如果你使用的是Dapper,那麼就有異步方法。 –

+0

所以當它到達等待線時,它會等到任務結束? –

+1

它將實際上服務於另一個web請求,直到任務完成,因此是異步部分。在非異步世界中,線程將被佔用,直到整個索引方法完成,因此這可能會提高性能。 –

回答

1

在ASP.NET上,您應該避免使用Task.Run。這是因爲Task.Run將通過使用另一個線程釋放當前線程。所以你會無緣無故地接受額外的上下文切換。此代碼將減少的可擴展性和性能,而不是增加它。

而是使用await來執行基於I/O的任務。例如,從數據庫獲取數據:

public async Task<ActionResult> Index() 
{ 
    context con = new context();  
    var list = await con.dep.ToListAsync(); 
    IEnumerable<test> get = getL(list); 
    return View(get); 
} 
+0

我明白了,謝謝。我有點新,所以你可以給我更多的基於I/O的任務的例子嗎? –

+1

@CarlosMiguelColanta:讀取或寫入文件,HTTP請求和數據庫調用是最常見的。 –