none
Problemas com thread e serviço criado RRS feed

  • Pergunta

  • Bom noite pessoal,

    Estou enfrentando um problema a alguns dias, porem creio que seja coisa boba, porem não consigo visualizar. Bom, a questão é a seguinte: Criei um serviço do Windows para ler um determinado aquivo *.txt, onde ele deve ser lido de 5 em 5 minutos. Criei uma thread para realizar esta pausa, porem por algum motivo, o serviço para de executar, gerando um problemão. Alguem pode me da uma ajudinha? Eis meu code: 

                  

    public partial class Service1 : ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
            }

            ProcessarLog processar = new ProcessarLog();

            protected override void OnStart(string[] args)
            {
                ThreadStart start = new ThreadStart(CriarThread);

                Thread thread = new Thread(start);

                thread.Start();
            }

            protected override void OnStop()
            {
                //EventLog.WriteEntry("servico finalizado", EventLogEntryType.Warning);
                processar.GerarLog(@"C:\SQUID_TCS\log\log.txt", DateTime.Now + " - Servico Parado.");
            }

            public void CriarThread()
            {
                while (true)
                {
                    Thread.Sleep(5000);

                    //imprime o  tempo de inicio do servico
                    processar.GerarLog(@"C:\SQUID_TCS\log\log.txt", DateTime.Now + " - Servico Iniciado.");

                    //processa o aruqivo de log
                    processar.Salvar(@"C:\Users\nelson\Google Drive\access.log");

                    //limpa o arquivo de log
                    processar.LimparLogSquid(@"C:\Users\nelson\Google Drive\access.log");           
                }
            }
        }

    //Classe ProcessarLog 

    public class ProcessarLog
        {
            /// <summary>
            ///  Realiza a leitura do arquivo access.log
            /// </summary>
            /// <param name="path">Informe o diretório do arquivo de log</param>
            /// <returns>Retorna a quantidade de registros processados</returns>
            public void Salvar(string path)
            {
                ComandoSQL cmd = new ComandoSQL("StringBanco");


                string aSql = "";
                int cont = 0;
                try
                {
                    foreach (Parametro p in readAccesLog(path))
                    {
                        aSql = "insert into cache (data,tempoLoad,ip,status,statusConexao,url,username,conteudoResposta) " +
                                        " values ('" + p.data + "','"
                                                    + p.tempoLoad + "','"
                                                    + p.ip + "','"
                                                    + p.status + "','"
                                                    + p.stausConexao + "','"
                                                    + p.url + "','"
                                                    + p.username + "','"
                                                    + p.conteudoResposta + "')";
                        cmd.ExecSQL(aSql);
                        
                        cont++;
                    }
                }
                catch (Exception ex)
                {
                    GerarLog(@"C:\SQUID_TCS\log\Erro.txt", ex.Message);
                }
                finally
                {
                    GerarLog(@"C:\SQUID_TCS\log\log.txt", DateTime.Now + " - " + cont + " linhas processadas.");
                }
            }

            /// <summary>
            /// Realiza a leitura do arquivo "access.log" gerado pelo squid
            /// </summary>
            /// <param name="path">Deve-se informar o diretório onde encontra-se o arquivo de log do squid. Lembrando que o diretório deve ser do seguinte padrão.: "@\\Dir"</param>
            /// <returns></returns>
            public List<Parametro> readAccesLog(string path)
            {

                Parametro p = null;

                List<Parametro> list = new List<Parametro>();

                StreamReader sr = new StreamReader(path);

                string read = "";

                string[] aux;

                try
                {
                    do
                    {
                        //ler a linha log
                        read = sr.ReadLine();

                        if (read != "")
                        {
                            //quebra por categoria
                            aux = read.Split(new char[] { });                        

                            //Verifica se existe valors vazios.
                            //Se existir, sera preenchido somente para nao ocorrer erros ao tratar o txt
                            for (int i = 0; i < aux.Length; i++)
                            {
                                if ((aux[i] == "") || (aux[i] == "-"))
                                    aux[i] = "null";
                            }

                            //Verifica se existe algum campo com valor "null".
                            //Se existir, sera descartado
                            ArrayList al = new ArrayList();
                            for (int i = 0; i < aux.Length; i++)
                                if (aux[i] != "null")
                                    al.Add(aux[i]);


                            //Verifica se a linha lida possui nome de usuario
                            if (al.Count == 10)
                            {
                                p = new Parametro();

                                p.data = al[0].ToString();
                                p.tempoLoad = al[1].ToString();
                                p.ip = al[2].ToString();
                                p.status = al[3].ToString();
                                p.tempoLoad = al[4].ToString();
                                p.stausConexao = al[5].ToString();
                                p.url = al[6].ToString();
                                p.username = al[7].ToString();
                                p.conteudoResposta = al[9].ToString();

                                list.Add(p);
                            }
                        }
                    } while (!sr.EndOfStream);
                }
                catch (IOException ex)
                {
                    GerarLog(@"C:\SQUID_TCS\log\Erro.txt", ex.Message);
                }
                finally
                {
                    //Fecha e destroi dados da memoria
                    sr.Close();
                    sr.Dispose();
                }
                return list;
            }



            /// <summary>
            /// Funcao que gera os logs do servico
            /// </summary>
            /// <param name="path">Informe o diretório para geracao do aquivo de log</param>
            /// <param name="msg">Informe a mensagem de erro gerada</param>
            public void GerarLog(string path, string msg)
            {
                StreamWriter vWriter = new StreamWriter(path, true, Encoding.ASCII);
                try
                {
                    vWriter.WriteLine(msg);
                }
                catch (IOException ex)
                {
                    GerarLog(@"C:\SQUID_TCS\log\Erro.txt", ex.Message);
                }
                finally
                {
                    vWriter.Flush();

                    vWriter.Close();

                    vWriter.Dispose();
                }
            }

            /// <summary>
            /// Realiza a limpeza do arquivo de log do squid.
            /// </summary>
            /// <param name="path">Deve-se informar o diretório onde encontra-se o arquivo de log do squid. Lembrando que o diretório deve ser do seguinte padrão.: "@\\Dir"></param>
            public void LimparLogSquid(string path)
            {
                StreamWriter sw = new StreamWriter(path, false, Encoding.ASCII);
                try
                {
                    sw.Flush(); //limpa os textos
                }
                catch (IOException ex)
                {
                    GerarLog(@"C:\SQUID_TCS\log\Erro.txt", ex.Message);
                }
                finally
                {
                    sw.Close(); //fecha o arquivo
                    sw.Dispose(); //destroi o objeto
                }
            }
        }
        public class Parametro
        {
            public string data { get; set; }
            public string tempoLoad { get; set; }
            public string ip { get; set; }
            public string status { get; set; }
            public string stausConexao { get; set; }
            public string url { get; set; }
            public string username { get; set; }
            public string conteudoResposta { get; set; }
        }

    terça-feira, 16 de agosto de 2016 01:38

Respostas

  • Boa tarde Nelson_lucas,

    Há alguma mensagem de erro?

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 16 de agosto de 2016 19:23
    Moderador

Todas as Respostas

  • Boa tarde Nelson_lucas,

    Há alguma mensagem de erro?

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 16 de agosto de 2016 19:23
    Moderador
  • Bom dia,

    Devido a falta de resposta do usuário

    essa thread está sendo fechada.

    Se o problema ainda estiver ocorrendo,

    favor abrir uma nova thread.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 19 de agosto de 2016 13:00
    Moderador