我有一个网站,可以创建某种形式的报告。整个过程需要一分钟。为了提高性能,我考虑将同步控制器转换为异步控制器。
我阅读了很多主题和指南,但我似乎并没有理解它。
现在我有一个DataSet,它有~15个DataTables。 ~15个DataTable中的每一个都由不同的Query填充。
要将此页面转换为异步控制器,我创建了一个 ConnectionManager ,为每个DataTable创建了15个 getMethods ,并且每个DataTable都在模型中。我还创建了 2 Controller - 一个名为 [Name] Async ,另一个名为 [Name] Complete 。但是,现在我被卡住了。
如何创建~15个线程并分配每个任务以使用getMethod填充DataTable?!
这是守则的某些部分。
控制器
public class RunTableStatisticsController : AsyncController
{
public void RunTableStatisticsAsync()
{
AsyncManager.OutstandingOperations.Increment(2);
// Create Threads who populate RunTableStatisticsModels DataTables
}
public ViewResult RunTableStatisticsComplete(RunTableStatisticsModel voModel)
{
return View(voModel);
}
}
getMethod
public static DataTable getDataTable1()
{
try
{
DataTable dtTemp= new DataTable();
dtTemp.Columns.Add(new DataColumn("ColumnName1", typeof(string)));
dtTemp.Columns.Add(new DataColumn("ColumnName2", typeof(string)));
string sQuery = "select * from 1";
// Instantiate the Command Object
OleDbCommand dbCommand = new OleDbCommand(sQuery, ..MyConnectionManager.Connection);
dbCommand.CommandType = CommandType.Text;
// Execute the Stored Procedure
OleDbDataReader dr = dbCommand.ExecuteReader();
while (dr.Read())
{
DataRow row = dtTemp.NewRow();
row["ColumnName1"] = dr["ColumnName1"]);
row["ColumnName2"] = dr["ColumnName2"];
dtTemp.Rows.Add(row);
}
return dtTemp;
}
catch (Exception ex)
{
throw new Exception("Error: Reading database.", ex);
}
}
我的模型
中的对应答案public DataTable dtTable1{ get; set; }
然后我有一个具有Telerik Grid Extensions的View,它将由Data填充。
答案 0 :(得分:2)
您可以使用TPL来并行化这些DataTable的检索。以下是2的示例,如果您有更多,可以考虑使用DataTables的集合:
public class RunTableStatisticsController : AsyncController
{
public void RunTableStatisticsAsync()
{
AsyncManager.OutstandingOperations.Increment(2);
// Create tasks that populate RunTableStatisticsModels DataTables
Task.Factory.StartNew(() =>
{
AsyncManager.Parameters["dt1"] = DAL.GetDataTable1();
AsyncManager.OutstandingOperations.Decrement();
});
Task.Factory.StartNew(() =>
{
AsyncManager.Parameters["dt2"] = DAL.GetDataTable2();
AsyncManager.OutstandingOperations.Decrement();
});
}
public ViewResult RunTableStatisticsComplete(DataTable dt1, DataTable dt2)
{
var model = new RunTableStatisticsModel
{
DtTable1 = dt1,
DtTable2 = dt2,
};
return View(model);
}
}