2012-07-18 49 views
1

我有一个网站,它创建某种形式的报告。整个过程需要一分钟。为了提高我在想打开同步控制器为异步控制器的性能。使用异步控制器填充数据表

我经历了很多话题的阅读和指南但我只是似乎没有得到它的窍门。

现在我有一个DataSet,它有15个DataTables。每个〜15个数据表都由不同的查询填充。

这个页转换成一个异步控制器我创建了一个的ConnectionManager,创建15周的getMethods为每个数据表和数据表的每个是在模型中。我还创建了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); 
    } 
} 

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

Correspondend我必须在我的模型

public DataTable dtTable1{ get; set; } 

然后,我有一个观点,其具有Telerik的网格EXTENS将由数据填充的离子。

回答

2

您可以使用TPL并行的数据表的检索。这里有一个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); 
    } 
} 
+0

这正是我所期待的。从这里我可以完成休息。非常感谢。 – seN 2012-07-19 14:26:51