繁体   English   中英

如何使C#等待之前的代码已执行?

[英]How to make c# wait until previous code has been executed?

这可能是一件简单的小事,但我无法弄清楚……我的代码中有一个方法,其中包含一个非常简单的语句:

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

在“ retrieveData”方法中,从数据库中检索了大量数据,并填充了一些列表视图。 这需要几秒钟,因此我希望“加载中”文本可见。

但是,当(check == 1)为true时,会发生什么,方法'retrieveData'将执行,然后labelTest.Text更改为“ Loading,Please wait”。

我该怎么做才能使其按正确的顺序运行,因此首先在IF语句中完成第一行,然后移至第二行? 我什至尝试了一个非常肮脏的解决方法(System.Threading.Thread.Sleep(1000)),以便给文本加载一秒钟的时间,但是即使这样也没有用。

通常,如果您使用的是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."
}

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

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

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

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

这将重新绘制标签,以便显示消息,但是在加载数据时应用程序仍然无响应。 为了保持应用程序的响应速度,您可以启动一个新线程来完成工作,或者按照Reed Copsey在其回答中的建议使用async

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM