当用户提交表单时,我需要从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 :(得分:0)
如果您没有看到提取数据的方式,我建议您使用async
和await
而不是Task.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