c# - 在 C# 中使用 .Show() 方法后,由于循环而导致对话框无法正确显示

标签 c# .net winforms visual-studio-2008 dialog

如果我似乎在发布同样的问题,我很抱歉。问题很相似,但每次我都会发现越来越多的问题。所以提前感谢所有的帮助。非常感谢。 :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/

相关文章:

c# - CloudBlobContainer .Exists() 将挂起/超时

c# - 通过单击控件显示工具提示文本

javascript - 如何在单击按钮时添加特定设计的 html 形式的文本框

c# - 使用 lambda 函数从旧列表创建新列表

c# - 使用游标从使用 C# 的 SQL Server 读取时间序列数据?

c# - 如何指定可以在 C# ColorDialog 中选取哪些颜色?

asp.net - 将预编译的 Web 应用程序转换为 'normal' Web 应用程序

c# - 为 PropertyGrid 添加工具提示

winforms - 使遗留的简单 win.forms 应用程序代码更加清晰

c# - Monogame 向方向移动