0

введите сюда описание изображения

Здравствуйте! Я реализовал данную форму. При клике на кнопку "Включить компьютер" у меня срабатывают следующие функции:

private CancellationTokenSource _cts;
private async void button1_Click(object sender, EventArgs e)
    {
        instanceClass1.temperature = 19;
        label2.Text = "Включен";
        label4.Text = "Температура: " + instanceClass1.temperature + " °C";
        label5.Text = "Мощность: 700 Ватт в час";
        label7.Text = "выключена";
        button1.Text = "Компьютер в работе";
        if (_cts != null)
            return;
        try
        {
            using (_cts = new CancellationTokenSource())
            {
                await ButtonFlashAsync(_cts.Token);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        _cts = null;
}

private async Task ButtonFlashAsync(CancellationToken token)
{
    for (int i = 20; instanceClass1.temperature < 65; i++)
    {
        if (instanceClass1.temperature <= 45)
        {
            label4.Text = "Температура: " + instanceClass1.temperature + " °C";
            instanceClass1.temperature++;
        }
        await Task.Delay(1000, token);

    }
}

Такой вопрос, как отменить асинхронную функцию при клике на вторую кнопку?

  private void button2_Click(object sender, EventArgs e)
    {
    label4.Text = "Температура: нет данных";
    label5.Text = "Мощность: нет данных";
    _cts?.Cancel();
}

Мне дали ответ про токен, однако ButtonFlashAsync не прерывается при нажатии на вторую кнопку.

  • Сколько еще вам надо закрыть вопросов, чтобы вы смогли скопировать код из уже существующего ответа? – aepot Mar 23 '23 at 20:27
  • ButtonFlashAsync не является асинхронным. Асинхронным метод делает не async, а await. – aepot Mar 23 '23 at 20:29
  • @aepot я сделал, как вы сказали, но почему у меня не прерывается при клике на вторую кнопку? См. код исправленный выше. – Данил Лазорин Mar 26 '23 at 17:28
  • ButtonFlashAsync не прерывается при нажатии на вторую кнопку. – Данил Лазорин Mar 26 '23 at 17:28
  • А где await Task.Delay вот вы токен отмены передали в метод, но его не используете никак. Где хоть один await в методе? Метод синхронный. Вы не сделали как я сказал. – aepot Mar 26 '23 at 21:37
  • Ещё // ... ex.Message замените на MessageBox.Show(ex.Message);, а то не смешно даже, ловите исключение, но никак себе не даете понять, что поймали. – aepot Mar 26 '23 at 21:40
  • Перенесите всё из button2_Click кроме _cts?.Cancel() в самый конец button1_Click. Не надо изобретать – aepot Mar 26 '23 at 21:43
  • 1
    Запомните 1 простую закономерность: если метод помечен как async, значит в нём обязательно должен быть как минимум 1 await. Просто как правило выучите себе. – aepot Mar 26 '23 at 21:46
  • 1
    @aepot спасибо вам ещё раз! Теперь точно всё сделал, всё работает. – Данил Лазорин Mar 28 '23 at 11:17

0 Answers0