C# 如果我运行一个需要5分钟才能完成的存储过程,我的代码序列是否会在该存储过程完成之前继续?

C# 如果我运行一个需要5分钟才能完成的存储过程,我的代码序列是否会在该存储过程完成之前继续?,c#,C#,如果我有一个程序运行一个大约需要5分钟才能运行的存储过程,例如: Database.RunJob(); -- takes 5 mins to complete MessageBox.Show("Hi"); 问题-在数据库运行作业()完成之前,消息框是否会显示“Hi” 如果是,我如何确保在继续下一行代码之前完成查询?信息不足,无法给出有意义的答案 我们能给出的最佳答案是:这取决于Database.RunJob()是同步的还是异步的 如果.RunJob是同步的(即在当前线程上运行),那么 Mes

如果我有一个程序运行一个大约需要5分钟才能运行的存储过程,例如:

Database.RunJob(); -- takes 5 mins to complete
MessageBox.Show("Hi");
问题-在数据库运行作业()完成之前,消息框是否会显示“Hi”


如果是,我如何确保在继续下一行代码之前完成查询?

信息不足,无法给出有意义的答案

我们能给出的最佳答案是:这取决于Database.RunJob()是同步的还是异步的

  • 如果.RunJob是同步的(即在当前线程上运行),那么 MessageBox.Show在.RunJob完成之前不会运行

  • 如果是异步的,则生成其他线程来执行该工作,然后 MessageBosh将在作业完成之前立即执行

由于您没有显示RunJob的实际功能,我们无法更准确地回答


让我们假设。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!");
}

这是一个单线程应用程序,因此可以安全地说,在完成该过程之前,它不会显示消息。这就是我一直在寻找的答案。谢谢:)