у кого время есть, покритикуйте?
От: nikkit  
Дата: 21.04.23 10:31
Оценка:
в общем так получилось, что в основном приходилось только бизнес логику ковырять. многопоточности касался очень немного. в ближайшее время данный пробел устраню.
в общем выставляю простейшую программу:
— винформс. форма с тремя кнопками: старт, пауза, стоп
— при нажатии старт запускается вычислительный процесс (тут у меня просто берет значение из поля ввода (дату), увеличивает ее на день, помещает новую дату в другой контрол и включает задержку). процесс выполняется итеративно, в фоне.
— при нажатии на паузу, выполнение процесса приостанавливается, при повторном нажатии возобновляется;
— при нажатии на стоп, процесс останавливается
В общем любой конструктив: критика, советы, вопросы по выбору такой реализации и т.п. категорически приветствуется.

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WorkWithMultithreading
{
    public partial class MainForm : Form
    {
        private const int timeout = 5000;

        private bool isPaused = false;
        private bool isStopped = false;
        private SynchronizationContext synchronizationContext;
        private CancellationTokenSource cancelTokenSource;
        private Task workingTask;
        public MainForm()
        {
            InitializeComponent();
            synchronizationContext = SynchronizationContext.Current;
        }

        private void btStart_Click(object sender, System.EventArgs e)
        {
            if (workingTask?.IsCompleted??true)
            {
                cancelTokenSource = new CancellationTokenSource();
                isStopped = false;
                workingTask = Task.Run(async () =>
                {
                    while (!isStopped && !cancelTokenSource.IsCancellationRequested)
                    {
                        if (!isPaused)
                        {
                            DateTime dt;

                            synchronizationContext.Send((_) =>
                            {
                                dt = dtpInputDate.Value.Date.AddDays(1);
                                edtResult.Text = dt.ToString();
                            }, null);
                        }

                        await Task.Delay(timeout);
                    }
                }, cancelTokenSource.Token);
            }
        }

        private void btPause_Click(object sender, System.EventArgs e)
        {
            if (!isStopped)
            {
                isPaused = !isPaused;
                btPause.Text = isPaused ? "Continue" : "Pause";
            }
        }

        private void btStop_Click(object sender, System.EventArgs e)
        {
            isStopped = true;
            edtResult.Text = string.Empty;
            cancelTokenSource.Cancel();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            isStopped = true;
            workingTask?.Wait();
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.