如何让c#等到上一个代码执行完毕?

时间:2014-07-28 17:54:20

标签: c#

这可能是一个简单的小事,但我无法弄明白...... 我的代码中有一个方法,有一个非常简单的陈述:

 if (check == 1) 
{
labelTest.Text = "Loading, please wait."
retrieveData()
}

在' retrieveData'方法,从数据库中检索大量数据,并填充一些列表视图。这需要几秒钟,所以我想要加载'文字可见。

但是,当(check == 1)为真时,方法' retrieveData'将执行,然后labelTest.Text更改为"正在加载,请稍候。"

我该怎么做才能让它以正确的顺序运行,所以首先完成IF语句中的第一行,然后继续前进到第二行? 我甚至尝试了一个非常脏的解决方法(System.Threading.Thread.Sleep(1000)),以便给文本加载一秒钟,但即使这样也没有用。

2 个答案:

答案 0 :(得分:3)

一般情况下,如果您使用的是C#5,则需要通过async执行此操作:

if (check == 1)
{
    labelTest.Text = "Loading, please wait."
    // ideally make this an async method:
    await retrieveDataAsync();
    // if that's not an option:
    // await Task.Run(() => retrieveDataAsync());
    labelTest.Text = "Done."
}

答案 1 :(得分:-1)

代码按照您期望的顺序执行,第一个语句在第二个语句开始之前完成。

但是,第一个语句不会更新标签的显示,它只会更改标签的文本并创建标签需要重新绘制的消息。当代码在主线程中运行时,在方法退出之前没有任何东西可以处理消息。

简单的解决方案是强制重绘控件:

labelTest.Text = "Loading, please wait.";
labelTest.Update();
retrieveData();

这将重绘标签以显示消息,但在加载数据时应用程序仍无响应。为了使应用程序保持响应,你可以开始一个新的线程来完成工作,或者使用async,正如Reed Copsey在他的回答中所建议的那样。