Forum

Пожалуйста or Регистрация для создания сообщений и тем.

Как прервать задачу async

Доброго времени суток пользователи форума 
Подскажите Как прервать задачу async  по нажатию на кнопку ?
Видео урок Я посмотрел но в моем код не сработало оно просто не дает повторно выполнить задачу а не прерывает её
Надеюсь мне подскажут

Код

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

namespace Прервать_задачу
{
    public partial class Form1 : Form
    {
        bool need = true;
        public Form1()
        {
            InitializeComponent();
           
        }

        async void button2_Click(object sender, EventArgs e)
        {
            await Task.Run(async () =>
            {
                while (need)
                {
                    label1.Text += '1';
                    await Task.Delay(3000); // 3 секунд
                    label1.Text += '2';
                    await Task.Delay(3000); // 3 секунд
                    label1.Text += '3';
                    await Task.Delay(3000); // 3 секунд
                    label1.Text += '4';
                    await Task.Delay(3000); // 3 секунд
                    label1.Text += '5';
                    await Task.Delay(3000); // 3 секунд
                    label1.Text += '6';
                    await Task.Delay(3000); // 3 секунд
                    label1.Text += '7';
                    await Task.Delay(3000); // 3 секунд
                    label1.Text += '8';
                    await Task.Delay(3000); // 3 секунд
                }
            });

        }

        private void button1_Click(object sender, EventArgs e)
        {
         need = false;
           
        }
    }
}

Приветствую 🖐
Если задача должна быть продолжена, то нужно писать отдельно метод, который будет фиксировать состояние.
Вообще, смотря о какой задаче речь. Где-то есть уже реализация, типа догрузчик, где-то нужно самому кумекать.

Удаленный пользователь и Удаленный пользователь отреагировали на эту запись.
Удаленный пользовательУдаленный пользователь
Цитата: XpucT от 19.05.2022, 18:47

Приветствую 🖐
Если задача должна быть продолжена, то нужно писать отдельно метод, который будет фиксировать состояние.
Вообще, смотря о какой задаче речь. Где-то есть уже реализация, типа догрузчик, где-то нужно самому кумекать.

Приветствую 🖐
Это понятно .

Вообще, смотря о какой задаче речь.

Задачу как раз я показал в коде ( просто упростил )

нужно самому кумекать

Пока мало знаний что бы понять , вот и спрашиваю ...

Добрый день 🖐
У Вас написан цикл while, который в начале программы начинает выполнятся, так как переменная Скопированоneed true.
Через каждые 3 секунды Вы пишите цифры от 1 до 8 в label.
Цикл while так устроен, что пока условие истинно, весь блок кода выполняется.
И Вы прервали задачу, поменяв переменную need в кнопке на false. То есть он не будет ещё раз писать от 1 до 8 в label, так как Вы прервали задачу.
Если Я Вас правильно понял, Вы хотели, чтобы цифры перестали записываться в label после нажатия на кнопку, тогда нужно перестроить код таким образом:

Код

bool need = true;
int i = 0;

async void button1_Click(object sender, EventArgs e)
{
    await Task.Run(async () =>
    {
        // Пока нам нужно, делай...
        while (need)
        {
            i++;
            await Task.Delay(1000);
            label1.Text += $"{i}";
        }
    });
}

async void button2_Click(object sender, EventArgs e)
{
    // Меняем переменную на false, тем самым останавливаем задачу
    need = false;
    // Ждём 2 секунды, чтобы поменять переменную обратно, чтобы можно было запустить задачу ещё раз
    await Task.Delay(2000);
    need = true;
}

admin и Удаленный пользователь отреагировали на эту запись.
adminУдаленный пользователь

Вероятно я запутал Цифры не нужны это пример был как в видео
Вот я еще упростил код
Чтобы было понятней 

Код

await Task.Delay(1000); // 3 секунды
label2.Text = "Win 10 Tweaker";
await Task.Delay(3000); // 3 секунды
label2.Text = "Сотни задач";
await Task.Delay(3000); // 3 секунды
label2.Text = "одно решение";
await Task.Delay(3000); // 3 секунды
label2.Text = "Win 10 Tweaker Pro";

 


Как остановить выполнение такой Задачи ?

На каждом этапе делать if, или думать, как решить иначе.

Добрый🖐.
Почему гуглить не хотите?)
Вот, в самом низу метод остановки по кнопке.