Как правильно закончить поток? - C#
Формулировка задачи:
Смотрите у меня будет класс в нем 2 действующих метода (ну и еще второстепенные), первый Допустим я создаю таким образом 5 потоков (пять раз выполняю метод
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 }
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; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д