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:(为什么我不明白为什么?:(