Как сделать паузу в Task(c#)?

180
18 июля 2021, 18:10

Есть Task, который запускается при нажатие кнопки. В нем не используются бесконечные циклы.

Task.Factory.StartNew(() => data.StartForFind(cancellationTokenSource.Token, textBoxStatus, treeViewResult), TaskCreationOptions.LongRunning);

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

Как можно это реализовать?

Answer 1

Если управлять нужно неким циклом, то можно так

private ManualResetEvent _manualEvent = new ManualResetEvent(true);
private void Run()
{
    Task.Run(() =>
    {
        while(условие остановки)
        {
            _manualEvent.WaitOne();
            // операции
        }
    });
}
private void Resume()
{
    _manualEvent.Set();
}
private void Pause()
{
    _manualEvent.Reset();
}
Answer 2

Останавливать поток надолго, хоть с помощью while, хоть с помощью ResetEvent - довольно расточительно: поток (ресурс операционной системы) занят, но не делает полезной работы.

Правильней было бы запоминать текущее состояние выполненной работы при включении паузы и завершать задачу (Task). А при продолжении восстанавливать состояние: стартовать новую задачу.

У вас осуществляется поиск файла. При включении паузы запоминаем номер (индекс) файла (или его имя). При продолжении начинаем просмотр коллекции файлов с него.

READ ALSO
Распознавание штрихкода с PDF файла

Распознавание штрихкода с PDF файла

у меня есть толстое приложение на сканере, которое должно сканировать штрихкод с PDF - файлаШтрихкод включает в себя 3 значения [Текстовое значение][пробел][Текстовое...

171
Взаимодействие C# WindowsForm ComboBox и Firebase

Взаимодействие C# WindowsForm ComboBox и Firebase

Основная проблема найти пример того, как в ComboBox Items вставлять ряд данных из базы Firebase, к примеру при нажатии кнопки

340
C# WPF задать стиль для ContentPresenter'ов которые внутри GridViewRowPresenter

C# WPF задать стиль для ContentPresenter'ов которые внутри GridViewRowPresenter

GridView состоит с GridViewRowPresenter'ов и если GridViewColumn задан DataTemplate для ячеек, то внутри GridViewRowPresenter'а будут не TextBlock а ContentPresenter с тем что мы зададим в DataTemplate...

280
Ожидание наполнения массива в другом потоке

Ожидание наполнения массива в другом потоке

У меня есть глобальный массив и 2 события eventНа момент запуска программы события вызываются параллельно

181