static public void ExecutionProcess(Action action, bool debugFlag = false) { try { eexecutionTokenSource = new CancellationTokenSource(); eexecutionToken = eexecutionTokenSource.Token; if (!serialPort.IsOpen) { throw new InvalidOperationException(); } if (!startExecution_status) { startExecution_status = true; action(); execution = new Task(() => { Point[] tempPoints = new Point[pointList.Count]; pointList.CopyTo(tempPoints); do { Passing.pastPoint = tempPoints[0]; //проходимся по всем точкам и выролняем их отправку foreach (Point point in tempPoints) { if (eexecutionToken.IsCancellationRequested) { return; //принудительное закрытие задачи } Passing.sinFunc(Passing.pastPoint, point, serialPort.Write); Passing.pastPoint = point; if (debugFlag) { CommonConsoleWrite(point.ToString()); } } } while (cycleStatus && startExecution_status); startExecution_status = false; action(); }); execution.Start(); } else { startExecution_status = false; //в зависимости от него переключить внешний вид кнопки запуска программы точек action(); eexecutionTokenSource.Cancel(); } } catch (Exception ce) { CommonConsoleWrite(ce.Message, Colors.Red); } }