none
Thread e exceções ( "O Thread estava em execução ou foi encerrado. Não pode ser reiniciado" , "O Thread estava sendo anulado" ) RRS feed

  • Pergunta

  • Boa Tarde a todos,

    Eu estou usando Thread no Windows form application para realizar checagens sobre determinada quantidade de tempo ( Thread.Sleep ) porem, está lançando algumas exceções que não consigo resolver.

    Primeiro, eu uso um Thread para não congelar o programa quando chegar no MessageBox, nisso, caso o Thread não estiver em execução ele gerá um arquivo de texto temporário e aguarda o usuário selecionar uma opção, para assim saber se ele gostaria de adicionar a um arquivo existente o conteúdo ou criar outro arquivo...

    else if (!Aguardar.IsAlive) //Caso o Thread não esteja sendo executado. {

    Aguardar.Start(newPath); //AQUI Está causando exeções, ele executa o Thread.

    // "O Thread estava em exeução ou foi encerrado. Não pode ser reiniciado" APÓS A SEGUNDA EXECUÇÃO DO START. }

    Na exceção ele fala que não foi possível reiniciar o thread.

    Também outra coisa que está acontecendo é que: quando eu clico para encerrar a aplicação, a aplicação pergunta se o usuário gostaria mesmo de encerra-la, mas quando ele clica em 'SIM' e ele usa o Thread.Abort() ele gerá uma execção falando que um Thread estava sendo encerrado. ( Acho que é por causa do Thread.Sleep() - das verificações por tempo. ) , como posso solucionar este problema?

    private void Aplicativo_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (MessageBox.Show(SAIR, "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.No)
                    e.Cancel = true;
                else
                {
                    Carregar.Verificar.Abort(); //Ele encerra o Thread, mas gera execção...! "O Thread estava sendo anulado."
                }
            }



    • Editado KDST quinta-feira, 8 de dezembro de 2016 16:50
    quinta-feira, 8 de dezembro de 2016 16:46

Respostas

  • Boa tarde,

    Tente utilizar uma das quator opções sugeridas aqui.

    Criar um thread apenas quando necessário,
    Criar um worker thread and fazer com que ele seja bloqueado ao invéz de terminado,
    Usar uma pool,
    Usar tasks.

    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.


    segunda-feira, 12 de dezembro de 2016 16:26
    Moderador

Todas as Respostas

  • Bom dia KDST,

    Esse erro ocorre quando várias tentativas (mais de uma thread) estão tentando executar o .Start(), you precisa sincronizar.

    Tem algum outro lugar com um Start()?

    Adicione um static _syncRoot:

    private _syncRoot = new object();

    Veja um exemplo nesse link.

    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, 9 de dezembro de 2016 11:54
    Moderador
  • Bom dia KDST,

    Esse erro ocorre quando várias tentativas (mais de uma thread) estão tentando executar o .Start(), you precisa sincronizar.

    Tem algum outro lugar com um Start()?

    Adicione um static _syncRoot:

    private _syncRoot = new object();

    Veja um exemplo nesse link.

    Atenciosamente,

    Entendo,

    O único local que tem o start é quando a aplicação inicia, no evento Load, mas existe um looping que fica chamando a função acaba 10 Segundos, após iniciada o start.

    while (Process.GetProcessesByName("Exemplo").Length == 0)
    { //Justamente quando a aplicação encerra, ela cria um log e precisa ser capturada para não ser substituida quando executar ela.
                            TransformarChatLog(stringProcessada);
                            Thread.Sleep(10000);
    }

    Seria isso?

    Não pode congelar, tipo, eu tenho um Thread só para o MessageBox, para continuar a aplicação rodando... congelaria se eu usa-se o lock?


    • Editado KDST sexta-feira, 9 de dezembro de 2016 21:53
    sexta-feira, 9 de dezembro de 2016 21:52
  • Boa tarde,

    Tente utilizar uma das quator opções sugeridas aqui.

    Criar um thread apenas quando necessário,
    Criar um worker thread and fazer com que ele seja bloqueado ao invéz de terminado,
    Usar uma pool,
    Usar tasks.

    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.


    segunda-feira, 12 de dezembro de 2016 16:26
    Moderador
  • Boa tarde,

    Devido a falta de interação do autor dessa pergunta,

    essa thread está sendo fechada. Caso o problema ainda

    esteja 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.

    quinta-feira, 15 de dezembro de 2016 15:05
    Moderador