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

RJ.*_*RJ. 3 c#

如果我有一个运行存储过程的程序,运行大约需要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)

  • 是的,我要去,但它说我可以在5分钟内接受. (4认同)