使用异步控制器填充DataTable

时间:2012-07-18 19:33:37

标签: c# asp.net-mvc database asynchronous

我有一个网站,可以创建某种形式的报告。整个过程需要一分钟。为了提高性能,我考虑将同步控制器转换为异步控制器。

我阅读了很多主题和指南,但我似乎并没有理解它。

现在我有一个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填充。

1 个答案:

答案 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);
    }
}