显示MessageBox但继续执行异步执行

时间:2015-12-19 16:12:21

标签: .net winforms async-await

在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电话无阻塞?

(是的,这意味着可能会同时弹出多个消息框。没关系。)

2 个答案:

答案 0 :(得分:1)

只要代码在WinForms UI线程上运行,如果此代码位于FormControl内,则可以使用Control.BeginInvoke,或者更通用SynchronizationContext.Post像这样

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

if (...)
    SynchronizationContext.Current.Post(_ => MessageBox.Show(...), null);

答案 1 :(得分:0)

while (true) {
    var result = await Compute();
        UpdateUI(result);
    if (...) Task.Run(() => { MessageBox.Show(...); });
}

如果您不关心用户在弹出窗口中按哪个按钮,那就足够了。