public void RunWorker(BackgroundWorker worker, DoWorkEventArgs args) { var getProgress = args.Argument as Func <ProgressState> ?? new Func <ProgressState>(() => ProgressState.Empty); CurrentProgress = getProgress() ?? ProgressState.Empty; ImportStarted(this, EventArgs.Empty); var type = Type.GetType(DataContextObject.SelectedDataType.Target.ClrType); var sessionFactory = DataContextObject.ShellContext.SessionFactoryHolder.GetSessionFactory(); CurrentProgress = new ProgressState(0, DataContextObject.TargetsToImport.Count); using (NHibernate.ISession session = sessionFactory.OpenSession()) { var current = 0; var total = DataContextObject.TargetsToImport.Count; int batchSize = Settings.Default.BatchSize; using (var tx = session.BeginTransaction()) { while (current < total && !args.Cancel && !Cancelled) { if (worker.CancellationPending) { args.Cancel = true; } else { var target = DataContextObject.TargetsToImport[current]; (target as ContentPartRecord).ContentItemRecord = DataContextObject.CurrentContentItem; try { session.Save(DataContextObject.TargetsToImport[current]); } catch (Exception ex) { GuardError(current, ex); } finally { if (current % batchSize == 0) { //20, same as the ADO batch size session.Flush(); session.Clear(); } current++; var progress = new ProgressState(current, total); worker.ReportProgress((int)Math.Floor(progress.Ratio * 100d), progress); if (current % 1000 == 0) { Application.Current.DoEvents(); } } } } session.Flush(); session.Clear(); tx.Commit(); } session.Close(); } }
private void BatchSaveInTransaction(IList <AppAuditLog> logs) { logger.LogInformation($"Batch save {logs.Count} audit logs to db ..."); session.SetBatchSize(logs.Count); using (var tx = session.BeginTransaction()) { try { session.SetBatchSize(logs.Count); foreach (var log in logs) { session.Save(log); } session.Flush(); session.Clear(); tx.Commit(); } catch (Exception ex) { tx?.Rollback(); logger.LogError(ex, "Can not save audit logs with transactions."); foreach (var log in logs) { logger.LogError(log.ToJson()); } } } }