如何异步填充每个循环的数据表数据集MVC

时间:2015-09-23 15:24:58

标签: c# asynchronous data-synchronization

我试图异步地获取一个充满多个数据表的数据集,但它似乎采用与异步调用之前相同的执行时间。可以请一些人给我一些建议,看看代码片段我在这里做错了什么。

在下面的代码中,假设结果参数有4个项目,负责执行存储过程4次并返回4个数据表。一个特定存储过程的最长执行时间约为7秒,因此我希望所有数据表的填充时间不超过7秒,否则没有异步调用,执行时间将达到大约15秒,这是任何方式都无法接受的。

    var ds = await FillDataSetAsync(asyncConnectionString, result);

    private Task<DataSet> FillDataSetAsync(string asyncConnectionString, List<Info> result)
    {
        var dataset = new DataSet();

        return Task<DataSet>.Factory.StartNew(() =>
        {
            foreach (var item in result)
            {
                DataTable dt = new DataTable("");

                using (SqlConnection conn = new SqlConnection(asyncConnectionString))
                {
                    var functionQuery = "Execute_StoredProcedure";                                               
                    SqlCommand comm = new SqlCommand(functionQuery, conn);

                    comm.Parameters.AddWithValue("Id", item.Id);

                    if (!string.IsNullOrWhiteSpace(item.Parameters))
                    {
                        comm.Parameters.AddWithValue("Parameters", item.OverrideParameters);
                    }

                    comm.CommandType = CommandType.StoredProcedure;

                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = comm;

                    da.Fill(dt);                                                                                                            dt.TableName = item.Id;                         
                    dataset.Tables.Add(dt);
                }
            }
            return dataset;
        });
    }

1 个答案:

答案 0 :(得分:0)

而不是

foreach (var item in result)
{
// your code
}

尝试:

Parallel.ForEach(result, item =>
{
// your code
});