如果我有一个运行存储过程的程序,运行大约需要5分钟,例如:
Database.RunJob(); -- takes 5 mins to complete
MessageBox.Show("Hi");
Run Code Online (Sandbox Code Playgroud)
问题 - 在 Database.RunJob()完成之前,消息框是否显示"Hi" ?
如果是这样,在继续下一行代码之前,如何确保查询完成?
Jud*_*ngo 11
信息不足,无法给出有意义的答案.
我们可以给出的最佳答案是:它取决于Database.RunJob()是同步还是异步.
如果.RunJob是同步的(也就是说,在当前线程上运行),那么在.RunJob完成之前,MessageBox.Show将不会运行.
如果它是异步的,产生其他线程来完成工作,那么MessageBosh将在作业完成之前立即执行.
由于您没有显示RunJob实际上做了什么,我们无法更准确地回答.
我们假设.RunJob是异步的.如果那个方法的设计者值得他的盐,他会从那个方法返回一些东西; 理想情况下,任务<T>.
如果他返回一个Task,你可以像这样编写你的C#5代码:
async void RunJobAndShowSuccessMessage()
{
await Database.RunJob();
MessageBox.Show("Hi, the job is done!");
}
Run Code Online (Sandbox Code Playgroud)
我们假设.RunJob是同步的,只在当前线程上运行.这意味着您可能不希望在UI线程上运行它; 这样做会导致应用程序UI冻结5分钟.
为了避免这种情况,让我们自己在不同的线程上运行数据库作业,以便应用程序UI保持响应:
async void RunJobAndShowSuccessMessage()
{
// Spawn a task to run in the background.
await Task.Factory.Start(() => Database.RunJob());
MessageBox.Show("Hi, the job is done!");
}
Run Code Online (Sandbox Code Playgroud)