2012-10-08 24 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