C# 如果我运行一个需要5分钟才能完成的存储过程,我的代码序列是否会在该存储过程完成之前继续?
如果我有一个程序运行一个大约需要5分钟才能运行的存储过程,例如:C# 如果我运行一个需要5分钟才能完成的存储过程,我的代码序列是否会在该存储过程完成之前继续?,c#,C#,如果我有一个程序运行一个大约需要5分钟才能运行的存储过程,例如: Database.RunJob(); -- takes 5 mins to complete MessageBox.Show("Hi"); 问题-在数据库运行作业()完成之前,消息框是否会显示“Hi” 如果是,我如何确保在继续下一行代码之前完成查询?信息不足,无法给出有意义的答案 我们能给出的最佳答案是:这取决于Database.RunJob()是同步的还是异步的 如果.RunJob是同步的(即在当前线程上运行),那么 Mes
Database.RunJob(); -- takes 5 mins to complete
MessageBox.Show("Hi");
问题-在数据库运行作业()完成之前,消息框是否会显示“Hi”
如果是,我如何确保在继续下一行代码之前完成查询?信息不足,无法给出有意义的答案 我们能给出的最佳答案是:这取决于Database.RunJob()是同步的还是异步的
- 如果.RunJob是同步的(即在当前线程上运行),那么 MessageBox.Show在.RunJob完成之前不会运行
- 如果是异步的,则生成其他线程来执行该工作,然后 MessageBosh将在作业完成之前立即执行
让我们假设。RunJob是异步的。如果该方法的设计者值得,他会从该方法返回一些东西;理想情况下是a 如果他返回一个任务,你可以这样编写你的C#5代码:
async void RunJobAndShowSuccessMessage()
{
await Database.RunJob();
MessageBox.Show("Hi, the job is done!");
}
让我们假设.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!");
}
这是一个单线程应用程序,因此可以安全地说,在完成该过程之前,它不会显示消息。这就是我一直在寻找的答案。谢谢:)