1

何らかの形式のレポートを作成するサイトがあります。プロセス全体に最大 1 分かかります。パフォーマンスを向上させるために、同期コントローラーを非同期コントローラーに変えることを考えていました。

たくさんのトピックやガイドを読みましたが、コツがつかめていないようです。

現在、最大 15 個の DataTables を持つ DataSet があります。15 個までの DataTable のそれぞれが、異なるクエリによって埋められます。

このページを非同期コントローラーに変換するために、私はConnectionManagerを作成し、各 DataTable に対して 15のgetMethodsを作成し、各 DataTable はモデル内にあります。また、 [Name]Asyncという名前のコントローラーと[Name]Completeという名前のコントローラーを 2つ作成しました。しかし、今私は立ち往生しています。

~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);
    }
}

getメソッド

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 拡張機能を持つビューがあります。

4

1 に答える 1

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);
    }
}
于 2012-07-19T05:50:25.687 に答える