c#任务不等待延迟计时器

时间:2018-06-02 11:22:12

标签: async-await task

我正在使用等待任务延迟。我想通过举例来理解这个问题:

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 :(得分:1)

我不完全确定为什么那不起作用,但可能有很多原因。你可能会推迟错误的线程/任务(我在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;
        }

答案 1 :(得分:1)

什么是计时器间隔?

试试这个:

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);
}
相关问题