Как прервать задачу async
Цитата: Удаленный пользователь от 19.05.2022, 16:51Доброго времени суток пользователи форума
Подскажите Как прервать задачу async по нажатию на кнопку ?
Видео урок Я посмотрел но в моем код не сработало оно просто не дает повторно выполнить задачу а не прерывает её
Надеюсь мне подскажут [spoiler title="Код"]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; } } }[/spoiler]
Доброго времени суток пользователи форума
Подскажите Как прервать задачу 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;
}
}
}
Цитата: admin от 19.05.2022, 18:47Приветствую 🖐
Если задача должна быть продолжена, то нужно писать отдельно метод, который будет фиксировать состояние.
Вообще, смотря о какой задаче речь. Где-то есть уже реализация, типа догрузчик, где-то нужно самому кумекать.
Приветствую 🖐
Если задача должна быть продолжена, то нужно писать отдельно метод, который будет фиксировать состояние.
Вообще, смотря о какой задаче речь. Где-то есть уже реализация, типа догрузчик, где-то нужно самому кумекать.
Цитата: Удаленный пользователь от 20.05.2022, 13:50Цитата: XpucT от 19.05.2022, 18:47Приветствую 🖐
Если задача должна быть продолжена, то нужно писать отдельно метод, который будет фиксировать состояние.
Вообще, смотря о какой задаче речь. Где-то есть уже реализация, типа догрузчик, где-то нужно самому кумекать.Приветствую 🖐
Это понятно .Вообще, смотря о какой задаче речь.
Задачу как раз я показал в коде ( просто упростил )
нужно самому кумекать
Пока мало знаний что бы понять , вот и спрашиваю ...
Цитата: XpucT от 19.05.2022, 18:47Приветствую 🖐
Если задача должна быть продолжена, то нужно писать отдельно метод, который будет фиксировать состояние.
Вообще, смотря о какой задаче речь. Где-то есть уже реализация, типа догрузчик, где-то нужно самому кумекать.
Приветствую 🖐
Это понятно .
Вообще, смотря о какой задаче речь.
Задачу как раз я показал в коде ( просто упростил )
нужно самому кумекать
Пока мало знаний что бы понять , вот и спрашиваю ...
Цитата: Удаленный пользователь от 20.05.2022, 14:10Добрый день 🖐
У Вас написан цикл while, который в начале программы начинает выполнятся, так как переменнаяneedtrue.
Через каждые 3 секунды Вы пишите цифры от 1 до 8 в label.
Цикл while так устроен, что пока условие истинно, весь блок кода выполняется.
И Вы прервали задачу, поменяв переменную need в кнопке на false. То есть он не будет ещё раз писать от 1 до 8 в label, так как Вы прервали задачу.
Если Я Вас правильно понял, Вы хотели, чтобы цифры перестали записываться в label после нажатия на кнопку, тогда нужно перестроить код таким образом:
[spoiler title="Код"]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; }[/spoiler]
Добрый день 🖐
У Вас написан цикл 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;
}
Цитата: Удаленный пользователь от 20.05.2022, 15:23Вероятно я запутал Цифры не нужны это пример был как в видео
Вот я еще упростил код
Чтобы было понятней
[spoiler title="Код"]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";
[/spoiler]
Как остановить выполнение такой Задачи ?
Вероятно я запутал Цифры не нужны это пример был как в видео
Вот я еще упростил код
Чтобы было понятней
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";
Как остановить выполнение такой Задачи ?
Цитата: Удаленный пользователь от 20.05.2022, 15:27На каждом этапе делать if, или думать, как решить иначе.
На каждом этапе делать if, или думать, как решить иначе.
Цитата: Удаленный пользователь от 20.05.2022, 15:31Добрый🖐.
Почему гуглить не хотите?)
Вот, в самом низу метод остановки по кнопке.
Добрый🖐.
Почему гуглить не хотите?)
Вот, в самом низу метод остановки по кнопке.