0

あなたが私を助けてくれることを願っています

ASP.NET アプリケーションを作成していますが、データベース レコードを更新するために、データ テーブル内の 70,000 以上のデータ行をループする必要があります (各データ テーブル行には、データベース レコードを更新するための情報があります)。私のアイデアは、テーブルを 10,000 行のテーブルに分割し、いくつかの非同期メソッドを作成してデータベースを更新することでした (テーブルごとに 1 つの非同期メソッド)。テーブルのすべてのレコードが更新されるようにする必要があるため、すべてが TransacionScope ブロックにラップされます。

問題は、Page.ExecuteRegisteredAsyncTasks() を実行すると、接続を取得するための最大許容時間が終了したことを示すタイムアウト例外が発生することです。

私のコードは次のとおりです

 using (TransactionScope transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, new TimeSpan(0, 120, 0)))
 {
 //Validando momentos                                        
 clConsultoraCompensationPlan.asignaValoresFinales(dtConsultoraCompensationPlan,
 compensation_plan, usuario,pagina);
 transaccion.Complete();
 }

private static void asignaValoresFinales(DataTable dtConsultorasMaster, clCompensationPlan compensation_plan, int usuario,Page pagina)
 {
 List<DataTable> lista_tablas = new List<DataTable>();
 //Separadno la tabla en 30 tablas
 foreach(IEnumerable<DataRow> renglones in LinqExtensions.Split(dtConsultorasMaster.AsEnumerable(), 50))
 {
 lista_tablas.Add(renglones.CopyToDataTable());
 }

 foreach (DataTable dtConsultoraCompensationPlan in lista_tablas)
 {
 AsignaValoresFinalesAsincrono tarea = new AsignaValoresFinalesAsincrono();
 PageAsyncTask tarea_asincrona = new PageAsyncTask(tarea.OnBegin, tarea.OnEnd, tarea.OnTimeout, new ContenedorAsignaValoresFinalesAsincrono(dtConsultoraCompensationPlan,compensation_plan,usuario), true);
 pagina.RegisterAsyncTask(tarea_asincrona);                
 }
 pagina.ExecuteRegisteredAsyncTasks();
}

シングルトン インスタンスを使用しているクエリを実行するために、何か影響はありますか? テーブルとマルチスレッドを分割するのではなく、このタスクを完了するためのより良い方法はありますか?

前もって感謝します

4

1 に答える 1

1

これは、更新のタイムアウトの問題です。トランザクション スコープが 1 つの接続を使用している場合は、おそらくコマンドまたは接続文字列のいずれかでコマンド タイムアウトを更新する必要があります。

于 2013-08-25T02:19:26.920 に答える