这可能是一个简单的小事,但我无法弄明白...... 我的代码中有一个方法,有一个非常简单的陈述:
if (check == 1)
{
labelTest.Text = "Loading, please wait."
retrieveData()
}
在' retrieveData'方法,从数据库中检索大量数据,并填充一些列表视图。这需要几秒钟,所以我想要加载'文字可见。
但是,当(check == 1)为真时,方法' retrieveData'将执行,然后labelTest.Text更改为"正在加载,请稍候。"
我该怎么做才能让它以正确的顺序运行,所以首先完成IF语句中的第一行,然后继续前进到第二行? 我甚至尝试了一个非常脏的解决方法(System.Threading.Thread.Sleep(1000)),以便给文本加载一秒钟,但即使这样也没有用。
答案 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在他的回答中所建议的那样。