【发布时间】:2013-11-14 14:47:40
【问题描述】:
我已经获得了多线程应用程序,并且已经完成。此应用程序中的所有消息框都由实用程序类中的单个static 方法正确调用。这个方法是:
public static void ErrMsg(String strMsg, Exception ex = null)
{
...
if (ex == null)
MessageBox.Show(strMsg, "MyApp", MessageBoxButtons.OK, MessageBoxIcon.Warning);
...
}
显然,这不提供IWin32Window 所有者,当我使用此方法从后台线程池线程调用错误消息时,这会导致我出现问题。问题是在我的主表单后面显示的一个已知消息框。见:
等。我可以将当前线程的SynchronisationContext 传递给ErrMsg 并执行
synchronizationContext.Send(callback =>
MessageBox.Show("Some error message for the user"), null);
但是有 700+ 次调用此方法,其中大部分在 UI 线程上,不会导致问题。我的问题是:我怎样才能修改 ErrMsg 方法,以便我的消息框出现在当前 SynchronisationContex 的前面,而不必修改对方法的所有 700 多次调用? p>
感谢您的宝贵时间。
编辑。 @Dmitry 的想法很棒。但是,如果活动表单没有焦点或者是 MdiChild 表单,则 Form.ActiveForm 将返回 null。为了解决这个问题,我使用Application.OpenForms.Cast<Form>().Last() 来获取最后一个活动表单,无论是 MdiChild 还是其他。代码现在...
Form activeForm = Application.OpenForms.Cast<Form>().Last();
if (ex == null)
{
activeForm.Invoke(new ShowErrMsg(text =>
MessageBox.Show(activeForm,
text,
"UserCost",
MessageBoxButtons.OK,
MessageBoxIcon.Warning)),
strMsg);
}
【问题讨论】:
标签: c# multithreading winforms dialog