Object reference not set to an instance of an object - (objects are not null)

0

Good afternoon,

I do not understand some concepts and I'm in great doubt about this problem, I did some research to try to identify, but without success.

I have this code and it is returning error at the time of calling the Log2 method

Parallel.ForEach(grupoServidores, new ParallelOptions { MaxDegreeOfParallelism = 80 },
servidor =>
{
    //Console.WriteLine((servidor);
    //Console.WriteLine((servidor);
    string mensagem = servidor;
    //Console.WriteLine((mensagem);

    // Variavel de timeout da thread
    var timeout = 30; // 22 seconds

    //Variavel de latencia da thread

    DateTime dataCheck = DateTime.Now;


    //Thread paralela com timeout
    Thread threadAgent = new Thread(() => AgentCheckThread(mensagem));
    threadAgent.IsBackground = true;
    threadAgent.Name = "Agent";
    threadAgent.Start();

    //Console.WriteLine(DateTime.Now + ":Estado da thread assim que inicia: " + threadAgent.ThreadState + " para o servidor: " + mensagem);
    Log(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + ";" + "Servidor=" + mensagem + ";" + "Processo=INICIO");
    while (threadAgent.ThreadState.ToString() != "Stopped" && DateTime.Now.Subtract(dataCheck) < TimeSpan.FromSeconds(timeout))
    {

    }

    //Verifica o resultado da consulta
    TimeSpan dataCheck2 = DateTime.Now.Subtract(dataCheck);
    TimeSpan timeoutCheck = TimeSpan.FromSeconds(timeout);
    try
    {
        if (listaServidores[listaServidores.FindIndex(s => s.Nome_Servidor == mensagem)].Status_Servidor == "OK")
        {

            Log(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + ";" + "Servidor=" + mensagem + ";" + "Processo=FIM;Status=OK");
            threadsFinalizadas++;
            totalThreadsFinalizadas++;
        }
        else if (listaServidores[listaServidores.FindIndex(s => s.Nome_Servidor == mensagem)].Status_Servidor == "ERROR")
        {

            threadsFinalizadas++;
            totalThreadsFinalizadas++;
            Servidor ServidorErro = new Servidor
            {
                Nome_Servidor = mensagem,
                Data_Consulta = listaServidores[listaServidores.FindIndex(s => s.Nome_Servidor == mensagem)].Data_Consulta,
            };
            listaServidoresErro.Add(ServidorErro);


            Log(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + ";" + "Servidor=" + mensagem + ";" + "Processo=FIM;Status=ERROR;Desc=" + listaServidores[listaServidores.FindIndex(s => s.Nome_Servidor == mensagem)].Desc);
            try
            {
                foreach (string erro in listaServidores[listaServidores.FindIndex(s => s.Nome_Servidor == mensagem)].Erros)
                {
                    ServidorErro.Erros.Add(erro);
                }
            }
            catch (Exception)
            {

                throw;
            }


        }
        else if (dataCheck2 >= timeoutCheck)
        {
            threadAgent.Interrupt();
            threadsFinalizadas++;
            totalThreadsFinalizadas++;
            servidoresErro.Add(mensagem);
            Log(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + ";" + "Servidor=" + mensagem + ";" + "Processo=FIM;Status=ERROR;Desc=Timeout:" + DateTime.Now.Subtract(dataCheck).ToString());
        }
        else
        {

            threadsFinalizadas++;
            totalThreadsFinalizadas++;
            servidoresErro.Add(mensagem);
            Log(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + ";" + "Servidor=" + mensagem + ";" + "Processo=FIM;Status=ERROR;Desc=Unknown");
        }
    }
    catch (NullReferenceException ex)
    {

        throw ex;
    }

    Log2(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + ";" + "Termino " + mensagem + " " + dataCheck2.ToString());

});

I do not understand what I need to do to not occur since the variables are not null.

Can you help me?

    
asked by anonymous 22.09.2016 / 17:49

1 answer

0

When you put Thread.Sleep (100);

Inside the loop While the problem was solved, for some reason it was generating timeout in the function.

while (threadAgent.ThreadState.ToString() != "Stopped" && DateTime.Now.Subtract(dataCheck) < TimeSpan.FromSeconds(timeout))
{
    Thread.Sleep(100);
}
    
23.09.2016 / 15:42