none
Executar loop por tempo RRS feed

  • Pergunta

  • Olá pessoal,

    Eu tenho um método que realiza um cálculo, e como esses cálculos são infinitos, ele precisa executar somente durante um tempo. Então, por exemplo, quero que execute os cálculos durante 1 minuto e depois me mostre o resultado.

    Porém, não sei como fazer isso da melhor forma. O método que encontrei, foi atribuir o tempo final antes de começar o loop e ficar verificando se a data atual é menor que esse tempo que já foi pré-estabelecido. Segue abaixo o código:

                while (DateTime.Now <= dataFinal)
                {
                     realizaCalculo();
                }

    Eu acho que perde muito desempenho essa condição no while. Não existe um jeito melhor de fazer isso?

    Fico no aguardo.

    Obrigado.


    • Editado Salazar, F sexta-feira, 14 de novembro de 2014 12:30
    sexta-feira, 14 de novembro de 2014 12:29

Respostas

  • Veja se assim roda melhor do que você já tem:

    Stopwatch s = new Stopwatch();
    s.Start();
    while (s.Elapsed < TimeSpan.FromSeconds(60)) 
    {
       Console.WriteLine(s.Elapsed);
    }
                
    s.Stop();

    Só mais uma coisa. Talvez o segredo não está no loop propriamente, mas sim na sua lógica para achar o número primo.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    sexta-feira, 14 de novembro de 2014 13:03
  • Claro que sim. 

    O conceito teórico é basicamente permitir o processamento paralelo, aplicado na computação distribuída você consegue executar vários processos simultaneamente, diferente do processamento linear, onde a execução funciona como uma "fila".

    Aplicado a sua necessidade você pode definir o intervalo de tempo de execução do seu método e o "sleep" da thread ficará responsável por gerenciar o tempo em que acontecerá a execução, de acordo com a condição e o critério de parada que você estabelecer .

    Talvez esse link te ajude a compreender melhor os conceitos: http://www.tutorialspoint.com/csharp/csharp_multithreading.htm

    Qualquer coisa estou à disposição.



    Th3W4rl0ck

    • Marcado como Resposta Salazar, F sexta-feira, 14 de novembro de 2014 13:13
    sexta-feira, 14 de novembro de 2014 13:10

Todas as Respostas

  • Se precisar executar por um tempo e intervalo definidos, uma boa opção é utilizar um Timer.

    Por exemplo, a cada 1 segundo executar, durante 1 minuto.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 14 de novembro de 2014 12:39
  • Você pode utilizar o conceito de Thread:

      while (true)
                {
                    realizaCalculo();
                    Thread.Sleep(10000); // Aqui você passa o tempo que o método ficará executando

    // convertido p/ milésimos de segundos
                }


    Espero ter ajudado.


    Th3W4rl0ck

    sexta-feira, 14 de novembro de 2014 12:47
  • Obrigado pela resposta, Juliano.

    Eu vi sobre o Timer, mas não entendi direito. Porque vi que a maioria usa para executar funções a cada intervalo de tempo. Por exemplo, executar um loop de 1 em 1 minuto.

    E o que eu preciso não é que ele agende a execução do loop, é que ele execute o loop DURANTE algum tempo.

    Não sei se é possível fazer isso no Timer também.

    Abraços!

    sexta-feira, 14 de novembro de 2014 12:47
  • Flávio,

    Eu sou novato ainda e não tenho muitas noções de Thread, só de ouvir falar.

    Pode me explicar como funciona, mais ou menos?

    Obrigado!

    sexta-feira, 14 de novembro de 2014 12:54
  • Você atê pode configurar o intervalo para tempos menores, mas se precisa que ele execute indefinidamente, o while é por onde deve ir.

    Mas qual a sua necessidade em processar repetidamente? Talvez isso ajude a construir uma resposta mais adequada.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 14 de novembro de 2014 12:54
  • Juliano,

    É um trabalho acadêmico, para encontrar o maior número primo no tempo de 1 minuto.

    É algo bem simples, mas quem conseguir fazer o código com melhor desempenho, ganha a nota máxima!

    sexta-feira, 14 de novembro de 2014 12:56
  • Veja se assim roda melhor do que você já tem:

    Stopwatch s = new Stopwatch();
    s.Start();
    while (s.Elapsed < TimeSpan.FromSeconds(60)) 
    {
       Console.WriteLine(s.Elapsed);
    }
                
    s.Stop();

    Só mais uma coisa. Talvez o segredo não está no loop propriamente, mas sim na sua lógica para achar o número primo.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    sexta-feira, 14 de novembro de 2014 13:03
  • Claro que sim. 

    O conceito teórico é basicamente permitir o processamento paralelo, aplicado na computação distribuída você consegue executar vários processos simultaneamente, diferente do processamento linear, onde a execução funciona como uma "fila".

    Aplicado a sua necessidade você pode definir o intervalo de tempo de execução do seu método e o "sleep" da thread ficará responsável por gerenciar o tempo em que acontecerá a execução, de acordo com a condição e o critério de parada que você estabelecer .

    Talvez esse link te ajude a compreender melhor os conceitos: http://www.tutorialspoint.com/csharp/csharp_multithreading.htm

    Qualquer coisa estou à disposição.



    Th3W4rl0ck

    • Marcado como Resposta Salazar, F sexta-feira, 14 de novembro de 2014 13:13
    sexta-feira, 14 de novembro de 2014 13:10
  • Juliano,

    Utilizei esse critério e melhorou um pouco o desempenho.

    Sei que a lógica para encontrar um número primo deve ser o principal fator para otimizar o desempenho. Vou verificar isso agora.

    Obrigado.

    sexta-feira, 14 de novembro de 2014 13:13
  • Obrigado Flávio.

    Irei utilizar Thread em outro trabalho, então vou ler o tutorial que me mandou.

    Qualquer dúvida, eu te contato.

    Abraços!

    sexta-feira, 14 de novembro de 2014 13:15