Как правильно закончить поток? - C#

Узнай цену своей работы

Формулировка задачи:

Смотрите у меня будет класс в нем 2 действующих метода (ну и еще второстепенные), первый

Exe

этот метод что то выполняет (внутри цикл), а второй

AddStream

, он создает объект

Task

добавляет в него в качестве Action метод

Exe

и запускает его, выглядит это как то так:
class cls
{
    protected bool stop = false;
    protected List<Task> tsk = new List<Task>();

    public void AddStream()
    {
        Task temp = new Task(this.Exe);
        temp.Start();
        this.tsk.Add(temp);
    }
 
    public void Exe()
    {
        while (stop == false)
        {
            // выполяется какое то действие
        }
    }
 
    // еще очень много свойств и методов, которые выполняются в Exe
}
Допустим я создаю таким образом 5 потоков (пять раз выполняю метод

AddStream

), потом мне в процессе выполнения понадобилось убрать 2 потока (по большому счету любых, т.к. они делают одно и тоже), т.е. что бы их было 3 всего, вопрос как это грамотно сделать? - если я изменю значение

stop

у меня прекратятся все потоки, а мне не это надо - не нашел я метода Abort в Task, но даже если бы он был, он бы не подошел, мне надо грамотно остановить поток, а не обрубить его Как я понимаю мне надо добавить еще какой то контроллер в цикл

while

в методе

Exe

, например получить

Id

объекта

Task

, передать его методу

Exe

и в

while

мониторить, стоит ли дальше выполнять этот цикл (ну т.е. теперь Exe будет знать какой конкретно Task он выполняет), как то так, но как то все это мудрено, нет ли способа попроще? А точнее по правильнее.

Решение задачи: «Как правильно закончить поток?»

textual
Листинг программы
void Main()
{
    CancellationTokenSource cts = new CancellationTokenSource();
    Task tsk = Task.Run(() => MyTask(cts.Token));
    cts.CancelAfter(1000);
    tsk.Wait();
}
 
static void MyTask(CancellationToken token)
{
    for (int i = 0; i < 30; i++)
    {
        Console.WriteLine("i: " + i);
        Thread.Sleep(100);
        if (token.IsCancellationRequested)
        {
            Console.WriteLine("stop..");
            break;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5
Похожие ответы