如果我有一个运行一个存储过程,大约需要5分钟运行,例如程序:如果我运行需要5分钟完成的存储过程,那么在存储过程完成之前,我的代码序列是否会继续?
Database.RunJob(); -- takes 5 mins to complete
MessageBox.Show("Hi");
的问题 - 在消息框中会显示“HI” BEFORE Database.RunJob()做完了?
如果是这样,在继续阅读下一行代码之前,如何确保查询已完成?
如果我有一个运行一个存储过程,大约需要5分钟运行,例如程序:如果我运行需要5分钟完成的存储过程,那么在存储过程完成之前,我的代码序列是否会继续?
Database.RunJob(); -- takes 5 mins to complete
MessageBox.Show("Hi");
的问题 - 在消息框中会显示“HI” BEFORE Database.RunJob()做完了?
如果是这样,在继续阅读下一行代码之前,如何确保查询已完成?
没有足够的信息给出有意义的答案。
我们可以给出的最佳答案是:它取决于Database.RunJob()是同步的还是异步的。
如果.RunJob是同步的(即,在当前线程上运行),然后 MessageBox.Show将无法运行,直到.RunJob完成。
如果它是异步的,产生其他线程做这项工作,然后 MessageBosh将在作业完成之前立即执行。
由于您没有显示RunJob实际上做了什么,我们无法更精确地回答。
让我们假设.RunJob是异步的。如果该方法的设计者值得他的盐,他会从该方法返回一些东西;最好是Task<T>。
如果他返回一个任务,你可以做你写C#5这样的代码:
async void RunJobAndShowSuccessMessage()
{
await Database.RunJob();
MessageBox.Show("Hi, the job is done!");
}
我们假设.RunJob是同步,只有当前线程上运行。这意味着你可能不想在UI线程上运行它;这样做会导致您的应用程序UI冻结5分钟。
为了避免这种情况,让我们运行在不同的线程自己的数据库工作,以便应用程序的用户界面保持响应:
async void RunJobAndShowSuccessMessage()
{
// Spawn a task to run in the background.
await Task.Factory.Start(() => Database.RunJob());
MessageBox.Show("Hi, the job is done!");
}
这是一个线程应用程序,它是安全的说,它不会显示直到完成该过程的消息。这是我正在寻找的答案。谢谢:) – Testifier 2012-08-01 16:10:49
是的,我要去但它说我可以在5分钟内接受。 – Testifier 2012-08-01 16:16:25