4

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

Database.RunJob(); -- takes 5 mins to complete
MessageBox.Show("Hi");

问题 - 在Database.RunJob() 完成之前,消息框是否会显示“Hi” ?

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

4

1 回答 1

11

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

我们可以给出的最佳答案是:这取决于 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 分钟。

为了避免这种情况,让我们自己在不同的线程上运行数据库作业,以便应用程序 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!");
}
于 2012-08-01T16:10:00.107 回答