2015-10-27 163 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