Olá, César. Tudo bom?
É realmente complicado fazer este controle com threads.
Parando uma Thread
Vamos começar dando uma olhada nos métodos que você sugeriu: Abort
, Interrupt
e Suspend
.
Quando chamamos thread.Abort()
basicamente estamos dizendo "Não importa o que você está fazendo. Seja um Thread.Sleep
ou na metade escrita da string em Console.WriteLine
, eu quero que você pare imediatamente agora" e esta é uma abordagem perigosa e desaconselhável ! É possível que sua aplicação fique em um estado inválido e seja encerrada.
A chamada de thread.Interrupt()
diz: "Eu não sei o que você está esperando, mas deixe de esperar e volte ao trabalho".
Então uma thread que executa a instrução Thread.Sleep(Timeout.Infinite);
se manteria dormindo para sempre, mas, se invocarmos thread.Interrupt()
em sua instância, o método Thread.Sleep
irá retornar e o código continuar.
O método Suspend
trabalha junto do método Resume
. Basicamente, o Suspend
faz o mesmo que o Abort
, com a diferença de que a thread pode voltar a execução com a chamada do método Resume
. Parece ótimo, não é mesmo? Mas nunca devemos utilizar estes métodos. São métodos igualmente perigosos, como o Abort
e estão oficialmente obsoletos - tentar utiliza-los irá gerar um warning.
Continuando a execução
Vimos o método Resume
trabalhando em conjunto do método Suspend
, mas nunca devemos os utilizar!
Encontrei o este artigo (infelizmente, em inglês apenas) com uma sugestão bem interessante.
A abordagem do autor do post é usar um "PauseToken" (muito semelhante ao cancelation token que vemos no curso de paralelismo com C# )
O artigo implementa uma solução usando Tasks
, no lugar de Threads - o que é uma boa prática! Raramente precisaremos trabalhar diretamente com a classe Thread.
Eu implementei o exemplo do artigo e executando meu código teremos uma saída assim:
Task executando. Dê enter para pausar sua execução...
Sou uma Task executando um loop pela 1º vez . . .
Sou uma Task executando um loop pela 2º vez . . .
Sou uma Task executando um loop pela 3º vez . . .
Sou uma Task executando um loop pela 4º vez . . .
Sou uma Task executando um loop pela 5º vez . . .
Task pausada. Dê enter para continuar sua execução...
Sou uma Task executando um loop pela 6º vez . . .
Task executando. Dê enter para pausar sua execução...
Sou uma Task executando um loop pela 7º vez . . .
Sou uma Task executando um loop pela 8º vez . . .
Sou uma Task executando um loop pela 9º vez . . .
Sou uma Task executando um loop pela 10º vez . . .
Task pausada. Dê enter para continuar sua execução...
O gist do código comentado tá disponível aqui https://gist.github.com/GuilhermeMatheus/8a26fecf3286ffba4819ecb7bc737249