【发布时间】:2016-02-13 00:50:57
【问题描述】:
我正在寻找合适的方法来处理可能从同时运行中受益的多个数据库调用。查询仅针对使用在我的 ASP.NET MVC 应用程序中以编程方式组装到 DataTables 中的数据进行插入或合并的存储过程。
当然,我看到了一些关于async 和await 的信息,这似乎是我需要做的,但我对如何实现它并没有清楚的了解。一些信息说调用仍然是连续的,并且一个仍然在等待另一个完成。这似乎毫无意义。
最终,我想要一个解决方案,让我能够在最长的过程完成所需的时间内运行所有查询。我希望所有查询都返回受影响的记录数(就像现在一样)。
这是我现在正在做的事情(绝不是平行的):
// Variable for number of records affected
var recordedStatistics = new Dictionary<string, int>();
// Connect to the database and run the update procedure
using (var dbc = new SqlConnection(db.Database.Connection.ConnectionString))
{
dbc.Open();
// Merge One procedure
using (SqlCommand cmd = new SqlCommand("MergeOneProcedure", dbc))
{
// 5 minute timeout on the query
cmd.CommandTimeout = 300;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@TVP", MergeOneDataTable);
// Execute procedure and record the number of affected rows
recordedStatistics.Add("mergeOne", cmd.ExecuteNonQuery());
}
// Merge Two procedure
using (SqlCommand cmd = new SqlCommand("MergeTwoProcedure", dbc))
{
// 5 minute timeout on the query
cmd.CommandTimeout = 300;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@TVP", MergeTwoDataTable);
// Execute procedure and record the number of affected rows
recordedStatistics.Add("mergeTwo", cmd.ExecuteNonQuery());
}
// Merge Three procedure
using (SqlCommand cmd = new SqlCommand("MergeThreeProcedure", dbc))
{
// 5 minute timeout on the query
cmd.CommandTimeout = 300;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@TVP", MergeThreeDataTable);
// Execute procedure and record the number of affected rows
recordedStatistics.Add("mergeThree", cmd.ExecuteNonQuery());
}
// Merge Four procedure
using (SqlCommand cmd = new SqlCommand("MergeFourProcedure", dbc))
{
// 5 minute timeout on the query
cmd.CommandTimeout = 300;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@TVP", MergeFourDataTable);
// Execute procedure and record the number of affected rows
recordedStatistics.Add("mergeFour", cmd.ExecuteNonQuery());
}
// Merge Five procedure
using (SqlCommand cmd = new SqlCommand("MergeFiveProcedure", dbc))
{
// 5 minute timeout on the query
cmd.CommandTimeout = 300;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@TVP", MergeFiveDataTable);
// Execute procedure and record the number of affected rows
recordedStatistics.Add("mergeFive", cmd.ExecuteNonQuery());
}
dbc.Close();
}
return recordedStatistics;
所有这些代码都在为 DataTables 组装数据的同一方法中。我对async 的有限理解让我相信我需要将之前的代码提取到它自己的方法中。然后我会调用该方法并await 返回。但是,我什至对它的了解还不够。
我以前从未做过任何异步/并行/多线程编码。这种情况只是让我觉得现在是进入的最佳时机。也就是说,我想学习最好的方法,而不是忘记错误的方法。
【问题讨论】:
标签: c# asp.net multithreading asynchronous