2017-03-21 67 views
0

我希望異步地獲取同一數據庫中的5個不同的視圖中的數據相同的數據庫不同的視圖中的數據 - 我用以下解決方案:異步正從

public async Task<List<Product>> GetProductsAsync() 
    { 
     string query = $"SELECT * FROM dbo.v_Products"; 

     try 
     { 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 

      var items = await _dbContext.Database.SqlQuery<Product>(query).ToListAsync(); 

      sw.Stop(); 
      Debug.WriteLine("\t " + Thread.CurrentThread.ManagedThreadId + $" getting Products ({items.Count}) seconds: " + sw.Elapsed.TotalSeconds); 

      return items; 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("Getting Products failed!", ex); 
     } 
    } 

有以下情況:我有〜 30個數據庫,每個數據庫都運行一個線程,並執行諸如「GetProductAsync」等方法來收集數據。但是我沒有看到使用異步的改進,似乎每個下一個方法的執行時間都包含前一次執行的時間。我在哪裏可能是錯的?

UPD:調用函數

public async Task<DataContext> GetDataAsync() 
    { 
     DataContext data = new DataContext(); 

     var items1= await _dac.GetProductsAsync(); 
     var items2 = await _dac.GetProducts2Async(); 
     var items3 = await _dac.GetProducts3Async(); 
     var items4 = await _dac.GetProducts4Async(); 
     var items5 = await _dac.GetProducts5Async(); 

     data.items1= items1; 
     data.items2= items2; 
     data.items3= items3; 
     data.items4= items4; 
     data.items5= items5; 

     return data; 
    } 

那是正確的,如果我將重新對每個異步方法執行分貝範圍內,喜歡這裏?

public async Task<List<Product>> GetProductsAsync() 
{ 
    string query = $"SELECT * FROM dbo.v_Products"; 

var ctx = new myDbContext(_dbContext.Database.ConnectionString); 

    try 
    { 
     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 

     var items = await ctx.Database.SqlQuery<Product>(query).ToListAsync(); 

     sw.Stop(); 
     Debug.WriteLine("\t " + Thread.CurrentThread.ManagedThreadId + $" getting Products ({items.Count}) seconds: " + sw.Elapsed.TotalSeconds); 

     return items; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("Getting Products failed!", ex); 
    } 
} 
+1

請發佈實際調用此函數的代碼 –

+3

等待塊執行,以便您的5個查詢按順序依次運行 – 3615

回答

2

呼叫所有Async方法,但Await所有這些以後,

public async Task<DataContext> GetDataAsync() 
{ 
    DataContext data = new DataContext(); 

    var t1 = _dac.GetProductsAsync(); 
    var t2 = _dac.GetProducts2Async(); 
    var t3 = _dac.GetProducts3Async(); 
    var t4 = _dac.GetProducts4Async(); 
    var t5 = _dac.GetProducts5Async(); 

    data.items1 = await t1; 
    data.items2 = await t2; 
    data.items3 = await t3; 
    data.items4 = await t4; 
    data.items5 = await t5; 

    return data; 
} 

創建爲每個調用新的上下文是不會只要數據庫調用的執行時間爲少產生任何問題。每個新的連接都使用/重新使用來自連接池的連接,所以你不應該吃掉所有的連接。

+0

請查看上面有關它的問題 - 是否可以? –

1
public async Task<DataContext> GetDataAsync() 
{ 
    DataContext data = new DataContext(); 
//crate individual tasks 
    var test1 = _dac.GetProductsAsync(); 
    var test2 = _dac.GetProducts2Async(); 
    var test3 = _dac.GetProducts3Async(); 
    var test4 = _dac.GetProducts4Async(); 
    var test5 = _dac.GetProducts5Async(); 
//Execute all tasks at once with WhenAll function 
    await Task.WhenAll(task1, task2, task3, task4, task5); 
//This statement is executed only after all the tasks are finished 
    return data; 
} 

參考MSDN Link對WhenAll詳細的筆記。