2015-10-16 48 views
0

我想弄清楚如何在我的應用程序的數據層中正確使用async/await來並行執行多個數據庫調用。運行多個Linq查詢異步

我正在使用Entity Framework和Linq來完成我的數據調用。

可以從任何應用程序類型(MVC Web App,Web API項目,Win From,Windows Service等)調用數據層 - 因此該方法的結果應該是單個對象。

public static async void GetLedger(long id, DateTime StartDate, DateTime EndDate) 
    { 
     var task_1 = DoComplexDBCallAsync1(); 
     var task_2 = DoComplexDBCallAsync2(); 
     var task_3 = DoComplexDBCallAsync3(); 
     var task_4 = DoComplexDBCallAsync4(); 
     var task_5 = DoComplexDBCallAsync5(); 

     await Task.WhenAll(task_1, task_2, task_3, task_4, task_5); 

     var result = ProcessAndMergeResultsFromAllDBCalls(task_1.Result, task_2.Result, task_3.Result, task_4.Result, task_5.Result); 

     return result; 
    } 

    private static async Task<List<SomeComplexType>> DoComplexDBCallAsync1(long id) 
    { 
     using (var metadata = DataAccess.getDesktopMetadata()) 
     { 
      var accounts = await (from row in metadata.db_GLAccount 
            where row.busID == id 
            select row).ToListAsync(); 

      return accounts; 
     } 
    } 

我將如何改變上述返回的Task<>object呢?

我是否需要用另一種方法來包裝它,該方法通過Task運行或RunSynchronously()調用GetLedger異步方法並返回結果? 如果是的話代碼將如何看,有什麼我需要知道的?

這種情況下的最佳做法是什麼?

+2

答案是**你不**。它應該返回一個'Task',而不是'void'或返回一個實際的項目。這就是使它能夠異步正常工作的原因。如果您希望它同步運行,那麼只需使用同步EF代碼完全創建一個完全同步的方法。 – Servy

+0

不需要。他們需要自己異步,並能夠看到這種方法是異步的。使用'await'使得實現異步更容易,但它仍然需要在那裏。 – Servy

回答

-1

你會使用等候如下

public static async Task<SomeObject> GetLedger(long id, DateTime StartDate, DateTime EndDate) 
    { 
     var task_1 = DoComplexDBCallAsync1(); 
     var task_2 = DoComplexDBCallAsync2(); 
     var task_3 = DoComplexDBCallAsync3(); 
     var task_4 = DoComplexDBCallAsync4(); 
     var task_5 = DoComplexDBCallAsync5(); 

     var result = ProcessAndMergeResultsFromAllDBCalls(await task_1, await task_2, await task_3, await task_4, await task_5); 

     return result; 
    } 

在「等待」關鍵字將自動獲得任務的結果,並將其應用到變量時,DB調用返回。 MSDN

你會再調用

var result = await GetLedger(id, StartDate, EndDate); 

一切都完成後,這將繼續。

+0

您已經將所有5個數據庫操作並行執行的操作從一個順序改爲全部操作,並且有跡象表明它們應該並行執行。他還特別詢問了如何使用這種方法*而不是*返回一個「任務」。 – Servy

+0

哎呀,對不起。我等待在錯誤的地方。編輯。 – Vlad274