2012-10-08 23 views
2

我刚刚在我们的代码库中找到了一个表单中的这个gem。我想我已经知道了这个答案:我很确定在后台线程中调用MessageBox.Show是一个可怕的想法,但是有人可以为我确认并澄清吗?调用MessageBox.Show从任务

private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (_FileScanner.IsSending) 
    { 
     Trace("Cannot close form because: Transferring files."); 
     e.Cancel = true; 
     Task<DialogResult> t = Task.Factory.StartNew(() => MessageBox.Show("Transferring files")); 
     return; 
    } 
} 
+0

是的,据我所知你应该只从UI线程调用UI,否则你可以从异常中获得任何意想不到的结果:)我不知道这段代码片段背后的原因是什么......;) –

+0

我是不完全确定,但是TaskScheduler实际上可以调度任务以使用UI同步上下文,并且代码可以在UI线程上执行。 – jags

回答

1

好像有小到没有在这样做的,其实隐患点 - 考虑到繁重的工作实际上是被利用的任务非UI阻塞线程处理(如应如此)那么您希望表单阻止输入的时间(取决于需求,但是无论对话模式如何,这仍然存在),直到确认是在STAThread上执行此操作为止。

+0

准确地说:这里的问题是所有繁重的工作都在UI线程上完成(因此阻塞),而我们的“高级”开发人员的解决方案是将MessageBox.Show调用推送到后台线程。 – pixelbadger