Pergunta

existe uma maneira de abortar threads criados com QueueUserWorkItem?

Ou talvez eu não precise?O que acontece se o aplicativo principal for encerrado?Todos os threads criados a partir dele são abortados automaticamente?

Foi útil?

Solução

Você não precisa abortá-los.Quando seu aplicativo for encerrado, o .NET eliminará todos os threads com IsBackground = true.O pool de threads do .NET tem todos os seus threads definidos como IsBackground = true, então você não precisa se preocupar com isso.

Agora, se você estiver criando threads atualizando a classe Thread, precisará anulá-los ou definir sua propriedade IsBackground como verdadeira.

Outras dicas

No entanto, se você estiver usando recursos não gerenciados nesses tópicos, poderá acabar com muitos problemas.

Isso dependeria de como você os estava usando - se esses recursos não gerenciados fossem agrupados corretamente, eles seriam tratados pela finalização do wrapper, independentemente do mecanismo usado para eliminar os threads que os referenciaram. E os recursos não gerenciados são liberados pelo sistema operacional quando um aplicativo é encerrado de qualquer maneira.

Há uma sensação geral de que os aplicativos (Windows) gastam muito tempo tentando limpar o desligamento do aplicativo - geralmente envolvendo grandes quantidades de memória de paginação apenas para que ela possa ser descartada novamente (ou código de paginação que roda em torno liberando objetos não gerenciados com os quais o sistema operacional lidaria de qualquer maneira).

O threadpool usa threads em segundo plano.Portanto, todos eles serão fechados automaticamente quando o aplicativo for encerrado.

Se você quiser abortar um thread sozinho, terá que gerenciá-lo você mesmo (para poder chamar Thread.Abort() no objeto thread) ou terá que configurar alguma forma de mecanismo de notificação que permitirá você diga ao thread que ele deve se abortar.

Sim, eles vão.No entanto, se você estiver usando recursos não gerenciados nesses threads, poderá ter muitos problemas.

sim, eles são de fundo, mas por exemplo, se você tiver um aplicativo onde usa ThreadPool para algum tipo de download múltiplo ou outras coisas, e quiser interrompê-los, como você para?minha sugestão seria:saia do tópico o mais rápido possível, f.ex

bool stop = false;
void doDownloadWork(object s) 
{
   if (!stop)
   {
       DownloadLink((String)s, location);
   }
}

e se você definir stop = true, os segundos threads (atualmente na fila) serão encerrados automaticamente, depois que os threads da fila terminarem o processo.

De acordo com a resposta de Lukas Šalkauskas.

Mas você deve usar:

volatile bool stop = false;

para informar ao compilador que esta variável é usada por vários threads.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top