Ejemplo n.º 1
0
        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();
            }
        }
Ejemplo n.º 2
0
 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());
             }
         }
     }
 }