2012-08-01 33 views

回答

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分钟。

为了避免这种情况,让我们运行在不同的线程自己的数据库工作,以便应用程序的用户界面保持响应:

async void RunJobAndShowSuccessMessage() 
{ 
    // Spawn a task to run in the background. 
    await Task.Factory.Start(() => Database.RunJob()); 
    MessageBox.Show("Hi, the job is done!"); 
} 
+0

这是一个线程应用程序,它是安全的说,它不会显示直到完成该过程的消息。这是我正在寻找的答案。谢谢:) – Testifier 2012-08-01 16:10:49

+4

是的,我要去但它说我可以在5分钟内接受。 – Testifier 2012-08-01 16:16:25

相关问题