C# 长时间计算后,MessageBox不会显示在mdi表单上

C# 长时间计算后,MessageBox不会显示在mdi表单上,c#,mdi,messagebox,C#,Mdi,Messagebox,这是一个非常类似的问题,遗憾的是,一个问题也没有得到回答 我有一个MDI主论坛,其中有几个儿童表单。其中一个执行长时间的计算,如果发生错误,则抛出异常。所有工作都在同一个线程上完成。然后,我尝试用messagebox通知用户一个错误,但是它没有出现,而是从MDI Main中窃取了焦点,因此应用程序完全没有响应 如果我调用Application.DoEvents,beheviour会有轻微的变化,我知道,但这是万不得已的事情。然后表单保持完全活动状态,只有在我将活动应用程序Alt+Tab更改为其他

这是一个非常类似的问题,遗憾的是,一个问题也没有得到回答

我有一个MDI主论坛,其中有几个儿童表单。其中一个执行长时间的计算,如果发生错误,则抛出异常。所有工作都在同一个线程上完成。然后,我尝试用messagebox通知用户一个错误,但是它没有出现,而是从MDI Main中窃取了焦点,因此应用程序完全没有响应

如果我调用Application.DoEvents,beheviour会有轻微的变化,我知道,但这是万不得已的事情。然后表单保持完全活动状态,只有在我将活动应用程序Alt+Tab更改为其他内容并再次返回后,messagebox才会出现

如何确保messagebox可见?我已经尝试将active child和MDI Main作为参数传递给MessageBox.Show方法。它不会改变行为


澄清一下:messagebox是子表单的一部分,但是在这一点上,我愿意以任何不会破坏应用程序的方式显示它。messagebox应该是模态的,但它应该是可见的,以便用户能够确认它。

messagebox是显示在主窗体中还是作为子窗体的一部分?如果MessageBox位于子窗体中,您可以将事件传递回主窗体并在那里打开MessageBox。

问题在于MessageBox往往是模态的。
在本例中,我认为在主MDI代码中使用带有处理程序的委托或事件要好得多。这样,主应用程序将显示消息框。如果希望传递所需的任何信息,您可以轻松地重新定义EventArgsType。

我也有同样的问题。按ALT键时,弹出窗口显示

它原来是一个LinkedLabel,其AutoSize属性为true。LinkedLabel位于FlowLayoutPanel中。当我将LinkedLabel.Text属性设置为String.Empty时。LinkedLabel不断尝试调整大小,这导致GUI不断繁忙

当我关闭AutoSize属性时,GUI不再需要重新计算位置。GUI不是免费的。弹出窗口显示

可能还有其他控件的行为与此相同。 另见:

您在这方面还存在问题吗?我写了一个变通方法,使用另一个线程来显示messagebox。我仍然不认为这个问题得到了回答,我的解决方案是一个变通方法,所以我不认为我会用它来回答我自己的问题。