Usuário com melhor resposta
Matar Thread

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.
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- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 28 de setembro de 2010 22:49
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 7 de outubro de 2010 23:57
Todas as Respostas
-
-
-
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.
-
Hi,
Amigo, tenta usar o this.Dipatcher.Invoke e executa o abort dentro do dispatcher
Att,
Adriel Codeco Silva
Email: adriel.silva@uppercase.com.br
MSN: adrielcodeco@hotmail.com
Blog: adrielcodeco.wordpress.com
Uppercase – www.uppercase.com.br -
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- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 28 de setembro de 2010 22:49
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 7 de outubro de 2010 23:57