簡體   English   中英

控制器中的 C# .NET Core 異步方法

[英]C# .NET Core async methods in controller

我對 .NET Core 比較陌生,並試圖了解異步/等待的使用,以幫助加快加載緩慢的頁面。

我原來的控制器方法是這樣的:

public IActionResult Index()
{
      //other code here

      regionVM.listEvents = getEvents(regionCatID);
      regionVM.listNews = getNews(regionCatID);
      regionVM.listLIA = getLIA(regionCatID);
      regionVM.listAwards = getAwards(regionCatID);

      return View("/Views/Regions/Index.cshtml", regionVM);
}

getEvents、getNews、getLIA 和 getAwards 是同一控制器中的所有其他方法。 它們在視圖模型中填充的相應列表用於在視圖中顯示四個不同的區域。 這一切都正確填充,但速度很慢。

我閱讀了很多不同的文章和帖子,但特別嘗試在此之后更新我的代碼: 如何在 .NET 4.5 中“同時”運行這兩種方法?

我的新方法如下所示:

public async Task<IActionResult> Index()
{
      //other code here

      var eTask = Task.Run(() => getEvents(regionCatID));
      var nTask = Task.Run(() => getNews(regionCatID));
      var lTask = Task.Run(() => getLIA(regionCatID));
      var aTask = Task.Run(() => getAwards(regionCatID));

      regionVM.listEvents = await eTask;
      regionVM.listNews = await nTask;
      regionVM.listLIA = await lTask;
      regionVM.listAwards = await aTask;

      return View("/Views/Regions/Index.cshtml", regionVM);
}

這似乎可以正常工作並且編譯沒有任何錯誤,但是現在當區域頁面加載時,這四個區域是否實際填充在視圖中是有點命中或錯過的。 例如,有時新聞區域會是空白的,當我知道有應該填充的新聞項目並且正在使用舊的同步方法填充時。

是否在任務執行完成之前加載視圖? 或者我會以完全錯誤的方式解決這個問題? 感謝您的任何建議。

有不同的方法來處理這個問題,但首先,我會確保理解 async/await。 Microsoft 有關於該主題的精彩文章和視頻。

另外,我不知道您調用的方法(例如 getEvents)是什么樣的,所以我的回答是假設它們是真正的異步方法。

一般來說,我會避免在 ASP.NET Core 應用程序中使用 Task.Run。 它只會導致額外的不必要的線程池調度。

 // Your new code can easily be rewritten as: public async Task<IActionResult> Index() { //other code here regionVM.listEvents = await getEvents(regionCatID); regionVM.listNews = await getNews(regionCatID); regionVM.listLIA = await getLIA(regionCatID); regionVM.listAwards = await getAwards(regionCatID); return View("/Views/Regions/Index.cshtml", regionVM); } // OR public async Task<IActionResult> Index() { //other code here var task1 = getEvents(regionCatID); var task2 = getNews(regionCatID); var task3 = getLIA(regionCatID); var task4 = getAwards(regionCatID); await Task.WhenAll(task1, task2, task3, task4); regionVM.listEvents = await task1; regionVM.listNews = await task2; regionVM.listLIA = await task3; regionVM.listAwards = await task4; return View("/Views/Regions/Index.cshtml", regionVM); }

因為這些示例中的每個示例中的代碼都是等待的,所以它保證在呈現區域頁面時,將填充四個區域,因為該行

 return View("/Views/Regions/Index.cshtml", regionVM);

在已獲取所有數據后執行。


如果您希望快速呈現頁面,還有其他方法可以提高頁面性能。 例如,我不確定在您的控制器操作中實際獲取了多少數據,但是,您可以使用 ajax 調用來獲取所有這些數據,而不是僅在返回所有數據時加載頁面。 這樣,您的控制器“索引”操作不會獲取所有數據並且您的頁面將立即呈現,然后您從您的 javascript 代碼進行 ajax 調用以獲取每個區域的數據。

執行此操作的一個常見示例是儀表板頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM