是否可以迭代多个数据集async BeginExecuteReader?

时间:2013-07-16 20:30:03

标签: c# sql-server asynchronous

我有一个长时间运行的存储过程,它返回多个结果。

我想异步迭代结果并在准备就绪时抓取结果(因为它们是可用的)。

ExecuteReaderAsync有一些WaitOne逻辑? (从未使用过,所以任何例子都表示赞赏)

这可能吗?

private IEnumerable<DataTable> validationResultSets(string MOName, DateTime StartDate, DateTime EndDate, string FilePath)
{
    DataTable d;
    using (SqlConnection conn =
    new SqlConnection(connString))
    {
        conn.Open();

        using (cmd = new SqlCommand("dbo.sp_ValidateAcceptanceFile", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter
            {
                ParameterName = "@MOName",
                Value = MOName,
                SqlDbType = SqlDbType.VarChar,
                Size = 255
            });

            cmd.Parameters.Add(new SqlParameter
            {
                ParameterName = "@StartDate",
                Value = StartDate,
                SqlDbType = SqlDbType.DateTime
            });

            cmd.Parameters.Add(new SqlParameter
            {
                ParameterName = "@EndDate",
                Value = EndDate,
                SqlDbType = SqlDbType.DateTime
            });

            cmd.Parameters.Add(new SqlParameter
            {
                ParameterName = "@FilePath",
                Value = FilePath,
                SqlDbType = SqlDbType.VarChar,
                Size = 500
            });

            //IDataReader rdr = cmd.ExecuteReader();
            IDataReader rdr = cmd.BeginExecuteReader(); //??
            try
            {
                do
                {
                    d = new DataTable();
                    d.Load(rdr);
                    yield return d;
                } while (!rdr.IsClosed);
            }
            finally
            {
                rdr.Close();
                rdr.Dispose();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你正在混合概念。返回多个结果的过程与MARS无任何关系。可以异步调用返回多个结果的过程,请注意,一旦结果的第一个片段从服务器返回,您的异步调用就会完成,并且从那里读取结果就像在同步代码中一样。