我們最近開發了一個ASP.Net WebAPI2,它使用跨各層的同步調用,如下所示。如何修復我的WebAPI2控制器以使用異步Task for scability
現在我才知道,那最好使用穩定的原因Async Task
的方法,但是隨着代碼爲大部分功能使用同步調用已經開發,我想知道什麼是轉換的最佳方式我有的電話。
說這是怎麼我的代碼最初寫的:
[Route("user/{userId}/feeds ")]
[HttpGet]
public IEnumerable<NewsFeedItem> GetNewsFeedItemsForUserAsync(string userId)
{
return newsFeedService.GetNewsFeedItemsForUser(userId);
}
我可以將此轉換爲這樣的事情:
[Route("user/{userId}/feeds ")]
[HttpGet]
public async Task<IEnumerable<NewsFeedItem>> GetNewsFeedItemsForUserAsync(string userId)
{
return await Task.Run(()=>newsFeedService.GetNewsFeedItemsForUser(userId));
}
但是,如果我理解正確的話,我不認爲將幫助我擴大我的網站,因爲它仍然會使用線程池線程。
我看到修改所有圖層和所有要使用的功能的唯一其他選項async
,但這似乎很多工作。
所以我想知道這裏有沒有人需要進行類似的練習,解決這個問題的最好方法是什麼。
問候 基蘭
'異步'一路... –
最好的方法是'newsFeedService'提供'async'方法,所以你可以從控制器中'等待'它。同時,'newsFeedService'應該有一個'async' DAO/Repository,它應該有'async'持久性策略,它應該有'async'方法,它應該與底層數據庫異步通信......(重點是你會必須將所有執行流轉換爲'async') –
如果'await'是該方法的最後一個語句,則可以將其刪除。刪除它後,如果你沒有'await'語句,你可以刪除'async'關鍵字。 –