Когда флажок снят, отключить его в течение определенного времени C #

Время от времени я сталкиваюсь с этим вопросом. Пример использования и пример, который мне нравится, это:

jeffs@jeffs-desktop:/home/jeffs  $ python36
Python 3.6.1 (default, Sep  7 2017, 16:36:03) 
[GCC 6.3.0 20170406] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cmath
>>> print(cmath.sqrt(-4))
2j
>>>
>>> dir(cmath)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e', 'exp', 'inf', 'infj', 'isclose', 'isfinite', 'isinf', 'isnan', 'log', 'log10', 'nan', 'nanj', 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau']
>>> 

Не имеет смысла создавать объект класса cmath, потому что в CMAT-объекте нет состояния. Однако cmath - это совокупность методов, которые в какой-то мере связаны. В моем примере выше все функции в cmath в некотором роде действуют на сложные числа.

-1
задан Rufus L 16 January 2019 в 17:17
поделиться

4 ответа

Это можно сделать без явного использования Timer. Вместо этого используйте асинхронный Task.Delay, который упростит код и облегчит понимание реальных / доменных намерений.

// Create extension method for better readability
public class ControlExtensions
{
    public static Task DisableForSeconds(int seconds)
    {
        control.Enabled = false;
        await Task.Delay(seconds * 1000);
        control.Enabled = true;
    }
}

private void checkBox1_CheckStateChanged(object sender, EventArgs e)
{
    var checkbox = (CheckBox)sender;
    if (checkbox.Checked)
    {
        checkbox.Text = "On";
        picturebox1.Show();
        pictureBox5.Hide();
    }
    else
    {
        checkbox.Text = "Off";
        checkbox.DisableForSeconds(15 * 60);
        pictureBox1.Hide();
        pictureBox5.Show();
    }
}
0
ответ дан Fabio 16 January 2019 в 17:17
поделиться

Вы можете отключить его и включить с помощью task.Delay (). Продолжить с(). Это создает новый поток, который запускается после задержки. Вы должны сделать его безопасным для потоков, winforms не является безопасным для потоков самостоятельно

0
ответ дан Maxime C. 16 January 2019 в 17:17
поделиться

Вы должны использовать Timer.SynchronizationObject

0
ответ дан OMGtechy 16 January 2019 в 17:17
поделиться

Короткий ответ

Из кода, который вы разместили, действительно только кажется, что вам нужно изменить код на , отключить флажок в событии CheckChanged и активируют его в событии timer1_Tick (а также Stop таймер в событии Tick).

Полный ответ

У Winforms есть элемент управления Timer, который вы можете использовать для этого. После того, как вы добавите Timer в конструктор, установите для свойства Interval количество миллисекунд, которое вы хотите подождать, прежде чем активировать флажок (1 секунда - 1000 миллисекунд, поэтому 15 минут - 15 мин * 60 сек / мин * 1000 мс / сек или 900,000 мс). Затем дважды щелкните по нему, чтобы создать обработчик события Tick (или добавьте его в ваше событие Form_Load, как я делал ниже).

Затем, в событии CheckChanged, если флажок не установлен, отключите флажок и запустите таймер.

Затем, в событии Tick, просто включите флажок (помните, это событие срабатывает после того, как прошло Interval миллисекунд) и остановите таймер.

Например:

private void Form1_Load(object sender, EventArgs e)
{
    // These could also be done in through designer & property window instead
    timer1.Tick += timer1_Tick; // Hook up the Tick event
    timer1.Interval = (int) TimeSpan.FromMinutes(15).TotalMilliseconds; // Set the Interval
}

private void timer1_Tick(object sender, EventArgs e)
{
    // When the Interval amount of time has elapsed, enable the checkbox and stop the timer
    checkBox1.Enabled = true;
    timer1.Stop();
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if (!checkBox1.Checked)
    {
        // When the checkbox is unchecked, disable it and start the timer
        checkBox1.Enabled = false;
        timer1.Start();
    }
}
0
ответ дан Rufus L 16 January 2019 в 17:17
поделиться
Другие вопросы по тегам:

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