Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Parar e continuar uma Thread C#

    Thread thread = null

    Thread thread = new Thread(() => {
        while (true)
        {
            Console.WriteLine("Thread " + DateTime.Now.ToString());
            Thread.Sleep(1000 * 10);
        }
    });

    thread.Start();

    if(algumaCoisa) QueroPararThread();
    else if (outraCoisa) QueroContinuarThreadCasoEstejaParada();

    private void QueroPararThread() {
        /*O que aham de devia ter aqui?*/
        //thread.Abort();
        //thread.Interrupt();
        //thread.Suspend();
    }

    private void QueroContinuarThreadCasoEstejaParada() {
        /*O que aham de devia ter aqui?*/
    }

alguém j fez algo parecido é pode ajudar.

2 respostas
solução!

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

Guilherme Matheus Costa Fico muito agradecido pela sua ajuda. Vou dar uma olhada no código que esta git, e no artigo que recomendou. ainda sim só sua resposta já me tirou muitas duvidas, Muito obrigado.