Как остановить многопоточное приложение?

Было дано задние найти корни уравнения и приложение, которое должно выводить данные из
дополнительного потока в элемент управления основного потока. Ответы выводятся мгновенно и не загораться клавиша “остановить” , а необходимо чтобы должно выводится промежуточные результаты и при помощи кнопки стоп можно остановить вычисления в любой момент (и был показан результат да же если он не окончательный)
Подскажите пожалуйста как это сделать, буду очень благодарна

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)
        {
            if (calculationThread != null && calculationThread.IsAlive)
            {
                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;
            }
        }
    }
}

А эта задача точно должна занимать много времени? Ответ правильный?
Может быть дело в параметрах, эпсилоне и т.п.

В этом коде не видно ничего про включение/отключение кнопок.
Видимо надо менять .Enabled кнопок при запуске/завершении.