2015-12-19 18 views
1

在WinForms項目中,我有一個運行的算法,它不斷計算數據並更新UI。它看起來像這樣:顯示消息框但繼續異步執行

async Task BackgroundWorkAsync() { 
    while (true) { 
     var result = await Compute(); 
    UpdateUI(result); 
    } 
} 

有時候,這取決於result包含我想顯示MessageBox但立即繼續運行算法。下面不起作用,因爲它會阻止進一步的處理,直到MessageBox被駁回:

while (true) { 
    var result = await Compute(); 
     UpdateUI(result); 
    if (...) MessageBox.Show(...); //new code 
} 

我怎樣才能讓MessageBox.Show通話無阻塞?

(是的,這意味着多個消息框可能在同一時間彈出。這是確定的。)

+0

這可能會讓用戶感到煩惱,但您可以創建一個Form並將其顯示給用戶。 –

+0

'BackgroundWorkAsync' /'Compute'能否在後臺線程上運行? –

+0

'BackgroundWorkAsync'在Load事件中啓動,並在UI線程上運行。我認爲''Compute'在內部做什麼並不重要。它可能存在UI依賴關係。 – boot4life

回答

1

一旦代碼是在WinForms的UI線程運行時,您可以使用Control.BeginInvoke如果這個代碼是內部的FormControl,或更一般的SynchronizationContext.Post這樣

if (...) 
    BeginInvoke(new Action(() => MessageBox.Show(...))); 

if (...) 
    SynchronizationContext.Current.Post(_ => MessageBox.Show(...), null); 
0
while (true) { 
    var result = await Compute(); 
     UpdateUI(result); 
    if (...) Task.Run(() => { MessageBox.Show(...); }); 
} 

如果您不關心用戶在彈出窗口中按下哪個按鈕,那就足夠了。

+0

這會在單獨的線程上運行消息框,這使得它非模態化並導致多個消息循環。 – boot4life