2015-10-27 160 views
0

當用戶提交表單時,我需要從5個不同的來源獲取數據。一旦來自這些5的數據被加載,我需要執行一些驗證。異步調用來加載數據並得到通知

如果我等待每個人在進入下一個之前被加載,它會花費太長時間。我想使所有這些調用都是異步的,一旦所有這些調用都被加載,就想要得到通知並繼續進行驗證。我怎樣才能做到這一點?我的方法是這樣的:

public void Submit() 
{ 
    var sqlData1 = GetSqlData(1, DateTime.Now.ToString(), 0, 1); 
    var sqlData2 = GetSqlData(2, DateTime.Now.ToString(), 0, 1); 
    var sqlData3 = GetSqlData(3, DateTime.Now.ToString(), 0, 1); 
    var sqlData4 = GetSqlData(4, DateTime.Now.ToString(), 0, 1); 
    var sqlData5 = GetSqlData(5, DateTime.Now.ToString(), 0, 1); 

    //Once all data is loaded perform my validation here 
} 



public List<sqlData> GetSqlData(int dataType, string dateTime, int getLatest, int getArchived) 
{ 
    var sqldata = new List<sqlData>();     

    DbCommandWrapper = Db.GetStoredProcCommandWrapper("sp_loadData"); 
    //add Params 
    var dataSet = Db.ExecuteDataSet(DbCommandWrapper); 
    return sqlData; 
} 
+0

請出示'GetSqlData',是功能異步或同步(是否返回'任務'或'SomeType')?我們還需要看到它,因爲如果您重複使用通話連接,'GetSqlData'可能不是線程安全的。 –

+0

添加上面的GetSqlData。所有的方法都會調用同一個數據庫,並從同一個表中獲取不同類型的數據。 – user3038399

+1

請參閱我想知道您是如何進行實際的數據庫調用的。現在我知道你的方法是同步的,最好的選擇是讓數據庫調用異步,但如果你不顯示如何進行數據庫調用,我不能告訴你如何去做。我也想看看你在哪裏重複使用'SqlConnection'對象,或者如果你在哪裏爲每個請求創建一個新對象。 –

回答

0

沒有看到你是如何獲取你的數據,我會建議使用asyncawaitTask.WhenAll代替Task.WaitAll,爲WaitAll仍然會阻塞線程。顯然這還沒有經過測試,但應該讓你接近你正在尋找的東西。

public async Task Submit() 
{ 
    int[] ids = new[] { 1, 2, 3, 4, 5 }; 
    var sqlList = new List<sqlData>(); 

    sqlList.Add(await Task.WhenAll(ids.Select(i => GetSqlData(i, DateTime.Now.ToString(), 0, 1)))); 
} 

public async Task<List<sqlData>> GetSqlData(int dataType, string dateTime, int getLatest, int getArchived) 
{ 
    var sqldata = new List<sqlData>(); 
    // populate sqldata here - make sure you use an await call 
    // make sure the method in your base call is updated to be async full-stack 
    return sqldata; 
} 

How and Where Concurrent Asynchronous I/O with ASP.NET Web API

+0

沒有任何示例或探索如何使它異步我懷疑他會正確地將'GetSqlData'更改爲異步,可能OP會逐字複製您的代碼,只是'async'而不在'GetSqlData'內部有任何'await',而類將會像以前一樣運行。 –

+0

謝謝@ScottChamberlain。是的,我希望答案中的模式以及我提供的鏈接可以讓他獲得異步編程的要點。正如我所說的(相信你也是這麼做的),沒有看到他是如何獲取數據的(意思是,沒有看到OP所指的基類),我不能給出一個*完整的答案。他需要將該基類方法設置爲異步並等待調用完全堆棧。但希望這匹馬能通水。 – ragerory