使用async在线程中休眠而不会冻结

jac*_*obz 41 c# sleep asynchronous freeze

所以我在这里贴了一个标签("").单击按钮(按钮1)时,标签文本变为"测试".2秒后,文本将重新设置为"".我使用计时器(间隔为2000)完成了这项工作:

private void button1_Click(object sender, EventArgs e)
{
    label1.Text = "Test";
    timer.Enabled = true;
}

private void timer_Tick(object sender, EventArgs e)
{
    label1.Text = "";
}
Run Code Online (Sandbox Code Playgroud)

这有效; 但是,我很好奇它使它在异步方法中工作.

我的代码目前看起来像这样:

private void button1_Click(object sender, EventArgs e)
{
    label1.Text = "Test";
    MyAsyncMethod();
}

public async Task MyAsyncMethod()
{
    await Task.Delay(2000);
    label1.Text = "";
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

sa_*_*213 87

正如我所提到的,你的代码对我来说很好,但也许尝试设置你的处理程序asyncTask.Delay在那里运行.

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    label1.Text = "Test";
    await Task.Delay(2000);
    label1.Text = "";
}
Run Code Online (Sandbox Code Playgroud)

  • @JoshMc你是对的,但这会导致GUI线程被阻塞2秒.这不是一个好的解决方案. (3认同)
  • 是的,我认为很难说出我的问题是什么。然而,这似乎没有任何问题:) 谢谢,我会尽量小心地提出未来的问题。 (2认同)
  • 对于那些不想创建异步函数的人:Task.Delay(2000).Wait();。 (2认同)