kykyryky
@kykyryky

Как правильно приостановить и продолжить выполнение Task из другого потока?

Есть форма, на ней 3 кнопки: старт, пауза и продолжить, а так же прогрессбар для отображения выполнения задачи.
"Ставлю на паузу" с помощью lock. Вот код:

public class DataForProgress
    {
        public int Count { get; set; }
        public int Value { get; set; }
    }
    public partial class Form1 : Form
    {
        private object syncObj = new object();
        private static IProgress<DataForProgress> progress;
        public Form1()
        {
            InitializeComponent();
            progress = new Progress<DataForProgress>((i) =>
            {
                progressBar1.Maximum = i.Count;
                progressBar1.Value = i.Value;
            });
        }

        public Task LongRunningTask(IProgress<DataForProgress> progress)
        {
            return Task.Run(() =>
            {
                int count = 5;
                for (int i = 1; i <= count; i++)
                {
                    lock (syncObj) { }
                    progress.Report(new DataForProgress
                    {
                        Value = i,
                        Count = count
                    });
                    Thread.Sleep(2000);
                }
            });
        }

        public Task Pause(IProgress<DataForProgress> progress, int val, int count)
        {
            return Task.Run(() =>
            {
                lock (syncObj)
                {
                    progress.Report(new DataForProgress
                    {
                        Value = val,
                        Count = count
                    });
                    Thread.Sleep(10000);
                }
            });
        }

        private async void StartButton_Click(object sender, EventArgs e)
        {
            label1.Text = "Выполняется...";
            await LongRunningTask(progress);
            label1.Text = "Завершено";
        }

        private async void PauseButton_Click(object sender, EventArgs e)
        {
            label1.Text = "Пауза";
            await Pause(progress, progressBar1.Value, progressBar1.Maximum);
        }

        private void ContinueButton_Click(object sender, EventArgs e)
        {
            //?
        }
    }


А как продолжить выполнение задачи?
Да и останавливать поток на n секунд с помощью Thread.Sleep, чтобы сэмулировать паузу, мне кажется не лучшей идеей... но главная задача - это продолжить выполнение таска.
  • Вопрос задан
  • 2085 просмотров
Решения вопроса 2
@rare
ManualResetEventSlim
Ответ написан
@Sing303
Это делается с помощью системных событий
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы