使用异步方法在线程中实现睡眠而不冻结程序

75

所以我在这里放置了一个标签("")。当点击按钮(button1)时,标签文本将变为“测试”。2秒后,文本设置回“”。我使用计时器使其工作(间隔为2000):

所以我在这里放了一个标签("")。当点击按钮(button1)时,标签的文本变成"Test"。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 = "";
}

这个方法可以运行; 但是,我想尝试在异步方法中实现它。

目前我的代码如下:

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

public async Task MyAsyncMethod()
{
    await Task.Delay(2000);
    label1.Text = "";
}

然而,这并不起作用。


我刚刚尝试了你的方法,它很好用。点击后它会变成“测试”,两秒钟后又会变成“”。 - sa_ddam213
1
你能详细说明一下“这不起作用”吗?你期望什么,观察到了什么?编译器错误?异常堆栈跟踪? - Stephen Cleary
1个回答

148

正如我所提到的,你的代码对我来说运行良好,但是也许尝试将处理程序设置为async并在其中运行Task.Delay

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

2
是的,我认为很难确定我的问题所在。不过,现在看起来这个好像没有任何问题 :) 谢谢你,我会尽量更加仔细地表达我的问题。 - jacobz
3
对于那些不想创建异步函数的人:Task.Delay(2000).Wait(); - Josh Mc
5
@JoshMc 你说得没错,但是那样会导致GUI线程被阻塞两秒钟,这不是一个好的解决方案。 - sighol
真的 - 最近才意识到这一点,很好的观点。在绝大多数情况下,不推荐使用Wait()。 - Josh Mc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接