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

Async await c#任务不等待延迟计时器,async-await,task,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); }

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

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写入标签。无法等待


当我将上面的代码写入计时器时,它总是会启动并且毫无意义。我想睡觉而不冻结表格。我怎么能做到呢?

我不太清楚为什么这样做行不通,但可能有很多原因。您可能延迟了错误的线程/任务(我在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;
        }
DateTime begin=DateTime.Now;
DateTime firstDelay=begin.AddSeconds(5);
DateTime secondDelay=begin.AddSeconds(10);
DateTime thirdDelay=begin.AddSeconds(15);

虽然(begin我不确定为什么这样做行不通,但可能有很多原因。你可能延迟了错误的线程/任务(我在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;
        }
DateTime begin=DateTime.Now;
DateTime firstDelay=begin.AddSeconds(5);
DateTime secondDelay=begin.AddSeconds(10);
DateTime thirdDelay=begin.AddSeconds(15);

while(begin计时器间隔是多少

试试这个:

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);
}

时间间隔是多少

试试这个:

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);
}

您应该在
Task.Factory.StartNew
中使用'Thread.Sleep();'。此外,由于计时器间隔为1000,因此您必须在
Task.Factory.StartNew()
block中停止计时器。您可以举个例子:)@另外,我同意计时器必须停止或间隔大于15000,但在
Task.Factory.StartNew
Thread.Sleep
中,我们可以调用
label1.Invoke()
将文本设置为UI线程上的标签。无论如何,你的答案也是完美的。你应该使用
Task.Factory.StartNew
和其中的'thread.Sleep();'。另外,由于计时器间隔是1000,所以你必须停止
Task.Factory.StartNew()
block你能举个例子吗:)@Amogh,我同意计时器必须停止或间隔大于15000,但在
Task.Factory.StartNew
Thread.Sleep
中会有所帮助?@PauloMorgado回复有点晚,但在
Task.Factory.StartNew
中,我们可以调用
label1.Invoke()
来设置UI线程上的标签文本。无论如何,你的答案也是完美的。我建议你看看这一页:关于最佳答案的第一条评论解释了为什么task.delay是一个问题如果(wait==0){wait=1;label1.Text=“1”;wait task.delay(2000);label1.Text=“2”;wait Task.Delay(2000);wait=2;}如果(wait==2){wait=0;}我做了类似的事情,但我需要更高的稳定性:(您也可以尝试Thread.Sleep方法:System.Threading.Thread.Sleep(5000);表单不需要冻结。我只想像thread.sleep那样工作。但是,等待任务总是将1和2写入Label1。输出:不幸的是,意外的系列1和2:(为什么我不明白为什么?:(我建议查看此页面:关于最佳答案的第一条注释解释了为什么task.delay是一个问题(wait==0){wait=1;label1.Text=“1”;wait Task.Delay(2000);label1.Text=“2”;wait Task.Delay(2000);wait=2;}if(wait==2){wait=0;}我这样做了,但我需要更多的稳定性:(您也可以尝试Thread.Sleep方法:System.Threading.Thread.Sleep(5000);表单不需要冻结。我只想像Thread.Sleep那样工作。但是,等待任务总是将1和2写入Label1。输出:不幸的是,意外的系列1和2:(为什么我不明白为什么?:(