Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

David Ramires

Thread

Recommended Posts

Bom dia Galera, preciso fazer 4 ou mais conexões com banco de dados, em localidades diferentes, para não ficar me conectando uma por uma(pois iria demorar muito) quero ao mesmo tempo

fazer conexão com todas e trazer os resultados, pelo que vi posso fazer isso utilizando Thread, alguém pode me passar algum exemplo/dica?

 

obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu consegui fazer assim!

 

mas é o seguinte no final de tudo estava pensando em colocar os resultado de resp = relatoriodal.GetResultadoDiaDia(servico, DataInicial, DataFinal, tipo); num dataset

faço isso nessa linha:

 

ds.Tables.Add(resp);

mas da o erro:

Referência de objeto não definida para uma instância de um objeto.

 

 

foreach (Model.ServicoUsuario servico in usuarios)
                {
                    ThreadStart thsArquivo = delegate {                        
                         resp = relatoriodal.GetResultadoDiaDia(servico, DataInicial, DataFinal, tipo);
                         ds.Tables.Add(resp);// aqui que essa m***** da pau!!!! 
                    };
                    Thread thrArquivo1 = new Thread(thsArquivo);
                    thrArquivo1.IsBackground = true;
                    thrArquivo1.Start();
                    thrArquivo1.Join();  
                }

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu consegui fazer assim!

 

mas é o seguinte no final de tudo estava pensando em colocar os resultado de resp = relatoriodal.GetResultadoDiaDia(servico, DataInicial, DataFinal, tipo); num dataset

faço isso nessa linha:

 

ds.Tables.Add(resp);

mas da o erro:

Referência de objeto não definida para uma instância de um objeto.

 

 

foreach (Model.ServicoUsuario servico in usuarios)
                {
                    ThreadStart thsArquivo = delegate {                        
                         resp = relatoriodal.GetResultadoDiaDia(servico, DataInicial, DataFinal, tipo);
                         ds.Tables.Add(resp);// aqui que essa m***** da pau!!!! 
                    };
                    Thread thrArquivo1 = new Thread(thsArquivo);
                    thrArquivo1.IsBackground = true;
                    thrArquivo1.Start();
                    thrArquivo1.Join();  
                }

achei o erro, o problema é o ds( ds.Tables.Add(resp);) que o inicio do metodo estava sendo atribuido null

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem que ver se o seu ds ou o resp esta nulo.

 

Abraços...

 

era isso mesmo, o problema era o ds!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Masters...

 

Vamos falar um pouco sobre threads?

Muitas vezes vejo diversos programadores com duvidas sobre Threads, o que é muito natural pois nas linguagens antigas era um caos fazer e gerenciar uma thread.

Vou postar aqui um exemplo extramente simples e que cobre muito casos e talvez alem de resolver seus problemas com thread, dê uma visão de como usar elas facilmente.

 


    //Crie uma classe qualquer com todas as funções que deseja realizar em thread paralelas.
    // No exemplo abaixo eu criei uma classe que apaga todos os diretórios e pastas de uma pasta raiz.
    // Este processo ainda cria um log que é exbido no final.
    public class ThreadDirectory
    {
        public FileSystemInfo FileSystem { get; set; }
        private StringBuilder log = new StringBuilder();

        // O importante aqui é ter um "evento" na classe que vai disponibilizar este log ao final do processamento.
        // Eventos são uteis, pois você pode criar eles de forma que você possa acompanhar a thread não só ao final dela, mas passso-a-passo se necessário.
        public delegate void AfterDeleteHandler(StringBuilder sb);
        public event AfterDeleteHandler AfterDelete;

        // Aqui vai o metodo principal que inicia o processo de delete.
        public void StartDelete()
        {
            // Gravando o inicio do Log
            log.AppendLine(String.Format("++++++++++ INICIO: {0} ++++++++++", FileSystem.Name));

            // Chamando a recursiva que irá apagar os arquivos.
            DeleteFileSystemInfo(FileSystem);
            
            // Gravando o final do Log
            log.AppendLine(String.Format("++++++++++ FIM: {0} ++++++++++", FileSystem.Name));

            // Disponibilizando o Log caso a pessoa tenha utilizado o evento.
            if (AfterDelete != null)
                AfterDelete(log);
        }

        // Recursiva que apaga os arquivos e diretorios.
        private void DeleteFileSystemInfo(FileSystemInfo fsi)
        {
            // Antes de apagar, remove o atributo readonly caso o arquivo/ pasta estaja como read-only
            fsi.Attributes = FileAttributes.Normal;

            // Verificação simples se é um diretório
            var di = fsi as DirectoryInfo;
            if (di != null)
                // Se for um diretório, reinicia o processo para apagar o conteudo.
                foreach (var dirInfo in di.GetFileSystemInfos())
                    DeleteFileSystemInfo(dirInfo);

            // Apaga o diretório ou arquivo.
            fsi.Delete();

            Coloca no log que o arquivo/pasta foi apagado registrando a data e hora. 
            log.AppendLine(String.Format("{0} - Apagando {1}", DateTime.Now, fsi.FullName));
        }
    };

Esta é a classe que será chamada em thread pela nossa aplicação principal. É importante ressaltar que esta classe tambem funciona em stand-alone e não só em thread.

 

Chamando a classe em thread:

.
.
.
    ThreadDirectory dir1 = new ThreadDirectory() { FileSystem = new DirectoryInfo("C:\TESTE1") };
    dir1.AfterDelete += new ThreadDirectory.AfterDeleteHandler(dir_AfterDelete);

    ThreadDirectory dir2 = new ThreadDirectory() { FileSystem = new DirectoryInfo("C:\TESTE2") };
    dir2.AfterDelete += new ThreadDirectory.AfterDeleteHandler(dir_AfterDelete);

    ThreadDirectory dir3 = new ThreadDirectory() { FileSystem = new DirectoryInfo("C:\TESTE3") };
    dir3.AfterDelete += new ThreadDirectory.AfterDeleteHandler(dir_AfterDelete);


    new Thread(new ThreadStart(dir1.StartDelete)).Start();
    new Thread(new ThreadStart(dir2.StartDelete)).Start();
    new Thread(new ThreadStart(dir3.StartDelete)).Start();

.
.
.

Exemplo de visualização de Log


        //Neste exemplo o log será exido em um TextBox (MultiLine) após a conclusão.
        public void dir_AfterDelete(StringBuilder sb)
        {
            txtMemo.Text += sb.ToString();
        }

Resumo geral:

1) Threads podem ser chamadas de formas simples bastanto ter uma classe com o metodo a ser invocado.

2) Os eventos destas classes são importantes para acompanhar o andamento da thread.

 

 

Espero te-lo ajudado!

 

Abraços,

Angelo Compri http://forum.imasters.com.br/public/style_emoticons/default/natal_wink.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.