如果我似乎在发布同样的问题,我很抱歉。问题很相似,但每次我都会发现越来越多的问题。所以提前感谢所有的帮助。非常感谢。 :D
我想在循环内显示给定特定条件的表单/对话框。我的问题是我在程序中创建了这段代码,当我满足我的条件并显示我的表单时,它无法正确显示。我已将问题范围缩小到循环,因为它在程序中的其他位置工作正常。但是,每当我尝试在循环开始之前或循环内部调用表单上的 .Show 方法时,它都无法正确显示。具体来说,我的表单/对话框目前只有一个标签。这是当我在表单/对话框上调用 .Show 方法时发生的情况:
- 无法与表单/对话框进行交互(即移动它或用“X”关闭它) - 如果您将鼠标悬停在表单/对话框上,鼠标图标表明它正在思考/工作。
- 背景未加载 - 对话框的边框和标题栏/标题会加载,但背景不会加载。事实上,它并不是从那里开始的,因此您可以通过表单/对话框查看。如果您单击任意位置,背景就会变成黑色。
- 标签未加载 - 这可能与背景有关,但您看不到标签或它应该在的位置的轮廓/阴影。
这是我的代码段:
private void ConnectSequence(object sender, DoWorkEventArgs e)
{
EstablishingConnection ourECF = new EstablishingConnection();
// Loop till connected
while (!this.ourCC.Connected)
{
this.ourCC.InitializeConnection();
// If we didn't connect and ourECF isn't already shown then show it
if (!this.ourCC.Connected && false == ourECF.Visible)
{
ourECF.Show();
}
}
ourECF.Dispose();
}
这是我正在尝试做的事情:
- 循环直到建立连接
- 如果第一次尝试连接失败,则会显示一个表单/对话框,提醒用户正在尝试建立连接
代码本身效果很好。如果我关闭服务器并运行客户端应用程序,它会弹出无法正常工作的表单/对话框。当我重新打开服务器时,它会脱离循环并处理表单/对话框。目前,我有一个后台工作人员调用 ConnectSequence,因为我认为这可以解决我的问题。
到目前为止我已经尝试过:
- 线程的使用(System.Threads 和BackgroundWorker)
- 将其 .Visible 属性设置为 true(.Show 执行此操作,但尝试了一下)
- 实例化了我们的 ECF,并在尽可能多的不同地方调用它,看看是否能找到解决方法。
但最终因为这个循环而不起作用。我不知道为什么。任何帮助将非常感激。我非常感谢你的所有帮助。 :D
最佳答案
消息循环正在挨饿,表单需要消息泵才能正确显示和运行,而您的循环会阻止此消息泵执行此操作、泵送和处理消息。
“最简单”的操作过程是用 Application.DoEvents();
调用来散布循环,但这是一种黑客行为,通常会导致错误,例如用户单击按钮两次打开两个窗口等
正确的方法是以多线程方式处理这个问题,将阻塞代码放入后台线程... 或 ...放置表单,我理解这类似于“请等等,有事情正在发生”类型的表单,在它自己的后台线程中。这些解决方案都需要一些工作来处理线程问题。
因此,首先,检查 DoEvents
是否适合您,但请确保尝试单击表单、关闭表单等,以确保以后不会遇到奇怪的错误。
关于c# - 在 C# 中使用 .Show() 方法后,由于循环而导致对话框无法正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1927602/