в общем так получилось, что в основном приходилось только бизнес логику ковырять. многопоточности касался очень немного. в ближайшее время данный пробел устраню.
в общем выставляю простейшую программу:
— винформс. форма с тремя кнопками: старт, пауза, стоп
— при нажатии старт запускается вычислительный процесс (тут у меня просто берет значение из поля ввода (дату), увеличивает ее на день, помещает новую дату в другой контрол и включает задержку). процесс выполняется итеративно, в фоне.
— при нажатии на паузу, выполнение процесса приостанавливается, при повторном нажатии возобновляется;
— при нажатии на стоп, процесс останавливается
В общем любой конструктив: критика, советы, вопросы по выбору такой реализации и т.п. категорически приветствуется.
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();
}
}
}