Было дано задние найти корни уравнения и приложение, которое должно выводить данные из
дополнительного потока в элемент управления основного потока. Ответы выводятся мгновенно и не загораться клавиша “остановить” , а необходимо чтобы должно выводится промежуточные результаты и при помощи кнопки стоп можно остановить вычисления в любой момент (и был показан результат да же если он не окончательный)
Подскажите пожалуйста как это сделать, буду очень благодарна
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;
}
}
}
}