2
我想知道是否可以通过使用任务异步调用多个具有相同参数的不同存储过程,然后等待所有结果返回。TPL任务和存储过程
我有以下几点:
private Task<DataTable> DataBaseCall(string procedureName, params Pair[] where)
{
DataTable data = new DataTable();
SqlConnection connection = new SqlConnection(connStr);
SqlCommand command = new SqlCommand(procedureName, connection);
connection.Open();
for (int i = 0; i < where.Length; i++)
{
command.Parameters.Add(where[i].First.ToString(), where[i].Second.ToString());
}
var readerTask = Task<SqlDataReader>.Factory.FromAsync(command.BeginExecuteReader, command.EndExecuteReader, null);
return readerTask.ContinueWith(t =>
{
var reader = t.Result;
try
{
reader.Read();
data.Load(reader);
return data;
}
finally
{
reader.Dispose();
command.Connection.Close();
command.Connection.Dispose();
command.Dispose();
}
});
}
我与拨打:
private void SetReportVariables(string reportName, string[] storedProcedureName, string _clientGroup, string _clientCode, string _finYear, string _period)
{
Task[] tasks = new Task[storedProcedureName.Length];
for (int i = 0; i < storedProcedureName.Length; i++)
{
List<Pair> parameters = new List<Pair>();
parameters.Add(new Pair("@ClientGroup", _clientGroup));
parameters.Add(new Pair("@ClientCode", _clientCode));
parameters.Add(new Pair("@FinYear", _finYear));
tasks[i] = DataBaseCall(storedProcedureName[i], parameters.ToArray());
}
Task.WaitAll(tasks);
...........Do something with the DataTables.........
}
我有三个问题。
- 任何人都可以告诉我,如果这是一个好办法吗?
- 任何想法都是为什么我的_finYear变量有时会被忽略,这会导致错误。
- 我可以从任务中返回数据表吗?
感谢
迈克
嗨感谢您的答复。我已经添加了如何传递上面的变量。我只是传递一个存储的proc名称数组和三个变量作为字符串,但由于某种原因,我得到一个System.AggregateException错误,存储过程需要_finYear。奇怪的! – Beats
我可以想出唯一的猜测是你有一个_finYear的空值。如果您在调试器下运行,它应该在发生异常时断开并且您可以检查_finYear的值。 –