在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 :(得分:1)
只要代码在WinForms UI线程上运行,如果此代码位于Form
或Control
内,则可以使用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(...); });
}
如果您不关心用户在弹出窗口中按哪个按钮,那就足够了。