1

我有一个创建某种形式的报告的站点。整个过程最多需要一分钟。为了提高性能,我正在考虑将同步控制器变成异步控制器。

我阅读了很多主题和指南,但我似乎没有掌握它的窍门。

现在我有一个包含 ~15 个数据表的数据集。大约 15 个数据表中的每一个都由不同的查询填充。

为了将此页面转换为异步控制器,我创建了一个ConnectionManager,为每个 DataTable 创建了 15 个getMethod,每个 DataTable 都在模型中。我还创建了2 个控制器- 一个名为[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);
    }
}

获取方法

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 网格扩展。

4

1 回答 1

2

您可以使用 TPL 来并行化这些 DataTables 的检索。这是一个 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);
    }
}
于 2012-07-19T05:50:25.687 回答