Задача c # не ждет таймера задержки - PullRequest
0 голосов
/ 02 июня 2018

Я использую задержку задачи ожидания.Я хочу понять проблему, приведя пример:

private async void timer2_Tick(object sender, EventArgs e)
    {
        await Task.Delay(5000);
        label1.Text = "1";
        await Task.Delay(5000);
        label1.Text = "2";
        await Task.Delay(5000);
    }

Внутренний таймер: 1000 Проблема: Всегда записывает 1 и 2 на метку. Не могу ждать

Когда я пишу приведенный выше кодк таймеру, это всегда начинается и ерунда.Я хочу спать, не замораживая форму.как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Какой интервал таймера?

Попробуйте:

private volatile int running;

private async void timer2_Tick(object sender, EventArgs e)
{
    if (this.running != 0)
    {
        return;
    }

    Interlocked.Exchange(ref this.running, 1);

    await Task.Delay(5000);
    label1.Text = "1";
    await Task.Delay(5000);
    label1.Text = "2";
    await Task.Delay(5000);

    Interlocked.Exchange(ref this.running, 0);
}
0 голосов
/ 02 июня 2018

Я не совсем уверен, почему это не сработает, но может быть несколько причин.Возможно, вы задерживаете не тот поток / задачу (я столкнулся с этой проблемой в Java)?Могу ли я спросить, работает ли этот код на месте, чтобы мы могли получить больше информации по этой проблеме?Если это работает, то это должно подтвердить, что проблема - проблема задачи или потока.Вам нужно немного изменить это и добавить точки останова по мере необходимости.

        DateTime begin = DateTime.Now;
        DateTime firstDelay = begin.AddSeconds(5);
        DateTime secondDelay = begin.AddSeconds(10);
        DateTime thirdDelay = begin.AddSeconds(15);
        while (begin <= firstDelay)
        {
            begin = DateTime.Now;
        }
        label1.text = "1";
        while (begin <= secondDelay)
        {
            begin = DateTime.Now;                
        }
        label1.text = "2";
        while (begin <= thirdDelay)
        {
            begin = DateTime.Now;
        }
...