コード例 #1
0
 public void SalvarEmLote(List <Notificacao> notificacoes, int batchSize)
 {
     _notificacaoBm.SalvarEmLote(notificacoes, batchSize);
 }
コード例 #2
0
        /// <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.
                }
            }
        }