Хотя выбранный ответ обеспечивает хороший способ отображения MessageBox
из асинхронного потока, он не обрабатывает случай, когда вы хотите извлечь DialogResult
из показанного MessageBox
.
Если вы хотите вернуть DialogResult
из вызываемого MessageBox
, отображаемого поверх Form
. Затем вам нужно использовать делегат Func
вместо делегата Action
.
Action
делегаты всегда возвращают void, тогда как Func
имеет возвращаемое значение.
Вот небольшой метод, который я разработал для обработки этого конкретного сценария:
private DialogResult BackgroundThreadMessageBox(IWin32Window owner, string text)
{
if (this.InvokeRequired)
{
return (DialogResult) this.Invoke(new Func(
() => { return MessageBox.Show(owner, text); }));
}
else
{
return MessageBox.Show(owner, text);
}
}
Хотя это обычно не считается лучшей практикой или дизайном, он будет работать в крайнем случае.