异步调用加载数据并获得通知

时间:2015-10-27 20:12:20

标签: c# asp.net .net

当用户提交表单时,我需要从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;
}

1 个答案:

答案 0 :(得分:0)

如果您没有看到提取数据的方式,我建议您使用asyncawait而不是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