none
Matar Thread RRS feed

  • Pergunta

  • Bom dia pessoal,

     

    Não consigo matar uma Thread que eu criei, pois verifico que a aplicação está no Gerenciador de Tarefas. Só consigo fechar clicando em "Stop Debugging" no Visual Studio.

     

    No evento Closing da Window eu chamo um método para matar a Thread em outra classe. Veja logo abaixo:

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        vmp_mcc.AbortThread();
    }

     

    O método que mata a Thread nessa outra classe está da seguinte forma:

    public void AbortThread()
    {
        try
        {
            minhaThread.Abort();
        }
        catch (ThreadAbortException ex)
        {
            System.Console.WriteLine(ex.Message);
        }
    }

     

    Teóricamente a aplicação deveria fechar corretamente, mas a Thread "minhaThread" não "morre", impedindo o fechamento da aplicação.

     

    Agradeço toda ajuda.

     

    Um abraço,

    Ewerton.

    terça-feira, 21 de setembro de 2010 13:19

Respostas

  • Estou vendo uma coisa estranha aqui: quando você dá um Abort na thread, a exceção é jogada no contexto da thread e não no contexto da thread principal. Assim, o catch nunca vai acontecer. Agora, quanto ao fato de sua thread não morrer, pode ser outra coisa: os blocos finally são executados quando a thread é abortada e estes podem estar segurando o programa. O correto seria fazer algo assim:

     

     

    Thread newThread = new Thread(new ThreadStart(TestMethod));
    newThread.Start();
    Thread.Sleep(1000);
    newThread.Abort("aborta thread");

     

     

     

     

    void TestMethod()
    {
      try
     
    {
         // executa thread
     
    }
     
    catch (ThreadAbortException ex)
      {
       
    Console.WriteLine(ex.Message);
      }
    }

    Note que o try..catch está no método executado pela thread.

    []s

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    terça-feira, 28 de setembro de 2010 14:51

Todas as Respostas

  • tentou assim.

     Application.Current.Shutdown();

    Elvis Rodrigues
    Analista Desenvolvedor .Net
    MCP .Net Framework 2.0, MCTS SQL Server 2005
    foxelv@hotmail.com
    terça-feira, 21 de setembro de 2010 20:50
  • Você Abriu só essa Thread? tenta colocar null na variavel da thread depois do abort

    Bruno Ferreira de Souza
    Analista Desenvolvedor .NET
    MCP - Windows Form
    terça-feira, 21 de setembro de 2010 21:19
  • Elvinho, ainda não funcionou... mas eu acho que outras coisas estão "segurando" essa Thread, como por exemplo, Socket.

     

    Bruno. tentei colocar null na variável da Thread depois do Abort()... mas deu NullPointerException.

     

    Obrigado a todos por enquanto,

    Ewerton.

    quinta-feira, 23 de setembro de 2010 11:27
  • Hi,

    Amigo, tenta usar o this.Dipatcher.Invoke e executa o abort dentro do dispatcher

    Att,


    codeco Adriel Codeco Silva
    Email: adriel.silva@uppercase.com.br
    MSN: adrielcodeco@hotmail.com
    Blog: adrielcodeco.wordpress.com
    Uppercase – www.uppercase.com.br
    sexta-feira, 24 de setembro de 2010 05:29
    Moderador
  • Estou vendo uma coisa estranha aqui: quando você dá um Abort na thread, a exceção é jogada no contexto da thread e não no contexto da thread principal. Assim, o catch nunca vai acontecer. Agora, quanto ao fato de sua thread não morrer, pode ser outra coisa: os blocos finally são executados quando a thread é abortada e estes podem estar segurando o programa. O correto seria fazer algo assim:

     

     

    Thread newThread = new Thread(new ThreadStart(TestMethod));
    newThread.Start();
    Thread.Sleep(1000);
    newThread.Abort("aborta thread");

     

     

     

     

    void TestMethod()
    {
      try
     
    {
         // executa thread
     
    }
     
    catch (ThreadAbortException ex)
      {
       
    Console.WriteLine(ex.Message);
      }
    }

    Note que o try..catch está no método executado pela thread.

    []s

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    terça-feira, 28 de setembro de 2010 14:51