2015-12-19 20 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