public void SalvarEmLote(List <Notificacao> notificacoes, int batchSize) { _notificacaoBm.SalvarEmLote(notificacoes, batchSize); }
/// <summary> /// Thread de envio de notificações. /// </summary> /// <param name="usuarios">Usuários que serão notificados.</param> /// <param name="link">Link da notificação.</param> /// <param name="texto">Texto da notificação.</param> /// <param name="notificacaoBm">BM da notificação para operações com o banco dentro da Thread.</param> /// <param name="cpfAuditoria">CPF de auditoria.</param> /// <param name="isDebug">Caso em modo debug, exibe timers no console pra ajudar no debug.</param> /// <param name="config">Configuração com os dados da URL do SignalR.</param> private void ThreadInsertNotificacoes(IQueryable <Usuario> usuarios, string link, string texto, BMNotificacao notificacaoBm, string cpfAuditoria, bool isDebug, ConfiguracaoSistema config) { var count = 0; var lstSize = usuarios.Count(); // Tamanho de inserções por vez do batch. const int batchSize = 500; var stopWatch = new Stopwatch(); var batchNotList = new List <Notificacao>(); foreach (var usuario in usuarios) { // Zera o cronômetro e começa a marcar novamente // Só usa o cronômetro em debug. if (isDebug && !stopWatch.IsRunning) { stopWatch.Reset(); stopWatch.Start(); } var not = new Notificacao { DataGeracao = DateTime.Now, Link = link, DataNotificacao = DateTime.Now, TextoNotificacao = texto, Usuario = usuario, Auditoria = new Auditoria(cpfAuditoria) }; batchNotList.Add(not); // Faz inserts de x em x (sendo x = batchSize) ou menos na última página ou se só tiver um selecionado if (count != 0 && (count % batchSize == 0 || lstSize == count + 1) || lstSize == 1) { notificacaoBm.SalvarEmLote(batchNotList, batchSize); batchNotList = new List <Notificacao>(); // Mostra o tempo que demorou uma inserção // Só usa o cronômetro em debug. if (isDebug && stopWatch.IsRunning) { stopWatch.Stop(); var ts = stopWatch.Elapsed; // Format and display the TimeSpan value. var elapsedTime = string.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); Console.WriteLine("Tempo de " + batchSize + " inserções: " + elapsedTime); } } count++; try { // Enviar a notificação em tempo real via SignalR. NotificarUsuario(usuario.CPF, not, config); } catch (Exception) { // ignored. // Um dia pode precisar ter o log dos erros. } } }