Не выводятся промежуточные значения

Не выводятся промежуточные значения и почему-то не могу остановить программу, сразу выводятся все результаты. Спасибо за ответ.

Задание:

Разработать многопоточное приложение, которое должно выводить данные из дополнительного потока в элемент управления основного потока

Найти корни уравнения с точностью 0,001 методом касательных 5x^3+ 4x^2+ 4x+3 = 0 на интервале [-1,0]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApp66
{
    public partial class Form1 : Form
    {
        // Объявить переменные класса Form1
        private Calculator calculator; //Калькулятор для выполнения вычислений
        private Thread calculationThread; //поток для выполнения вычислений

        //Конструктор класса Form1
        public Form1()
        {
            InitializeComponent();
        }
        // Метод Form1_Load, вызывается при загрузке формы
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        // Метод, вызывается при нажатии кнопки "Start"
        private void buttonStart_Click(object sender, EventArgs e)
        {
            // Создать новый калькулятор и запустить его в отдельном потоке
            calculator = new Calculator(textBox1);
            calculationThread = new Thread(calculator.Calculate);
            calculationThread.Start();
        }

        // Метод, вызывается при нажатии кнопки "Stop"
        private void buttonStop_Click(object sender, EventArgs e)
        {
            // Остановить вычисления, отправив запрос на отмену
            calculator?.Cancel();
        }

        // Метод, вызывается при изменении текста в текстовом поле
        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }


        // Внутренний класс Calculator, выполняющий вычисления
        public class Calculator
        {
            // Константы, используемые при вычислениях
            private const double EPSILON = 0.001;
            private const double INTERVAL_START = -1.0;
            private const double INTERVAL_END = 0.0;

            // Поля класса Calculator
            private readonly TextBox outputTextBox; // Элемент управления, в который выводятся результаты
            private CancellationTokenSource cancellationTokenSource;// Токен отмены, используемый для отмены вычислений

            // Конструктор класса Calculator
            public Calculator(TextBox outputTextBox)
            {
                this.outputTextBox = outputTextBox;
            }

            // Метод Calculate, выполняющий вычисления
            public void Calculate()
            {
                try
                {
                    // Инициализировать токен отмены
                    cancellationTokenSource = new CancellationTokenSource();

                    // Выполнить вычисления
                    double x0 = INTERVAL_START;
                    double x1 = x0 + EPSILON;
                    double fx0 = Function(x0);
                    double fx1 = Function(x1);
                    double x = x1 - fx1 * (x1 - x0) / (fx1 - fx0);

                    while (Math.Abs(x - x1) > EPSILON && !cancellationTokenSource.IsCancellationRequested)
                    {
                        x0 = x1;
                        x1 = x;
                        fx0 = fx1;
                        fx1 = Function(x1);
                        x = x1 - fx1 * (x1 - x0) / (fx1 - fx0);

                        // Вывести результаты в элемент управления на главном потоке
                        outputTextBox.Invoke(new Action(() =>
                        {
                            outputTextBox.AppendText($"x = {x:F3}\r\n");
                        }));
                    }

                    // Вывести сообщение о завершении вычислений
                    outputTextBox.Invoke(new Action(() =>
                    {
                        outputTextBox.AppendText("Вычисления завершены\r\n");
                    }));
                }
                catch (OperationCanceledException)
                {
                    // Вывести сообщение об отмене вычислений
                    outputTextBox.Invoke(new Action(() =>
                    {
                        outputTextBox.AppendText("Вычисления отменены\r\n");
                    }));
                }
            }

            public void Cancel()
            {
                // Отменить вычисления, отправив запрос на отмену
                cancellationTokenSource?.Cancel();
            }

            private static double Function(double x)
            {
                return 5 * x * x * x + 4 * x * x + 4 * x + 3;
            }
        }
    }
}



Ответы (0 шт):