C# 对话框不';不能使用.Show正确显示,但不要使用';在C中进行多线程处理时,不希望阻止.ShowDialog#

C# 对话框不';不能使用.Show正确显示,但不要使用';在C中进行多线程处理时,不希望阻止.ShowDialog#,c#,multithreading,dialog,C#,Multithreading,Dialog,我有一个程序,需要连接到服务器以收集一些数据。我启动一个新线程并让它执行连接序列。在此序列中,它将继续尝试连接,直到成功连接为止 连接顺序的代码如下所示: // Code for InitializeConnection // Our address to our Authentication Server IPEndPoint authenServerEP = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 8007); // Connect

我有一个程序,需要连接到服务器以收集一些数据。我启动一个新线程并让它执行连接序列。在此序列中,它将继续尝试连接,直到成功连接为止

连接顺序的代码如下所示:

// Code for InitializeConnection
// Our address to our Authentication Server
IPEndPoint authenServerEP = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 8007);

// Connect to the Authentication server
while (!this.connected)
{
    try
    {
        this.sock.Connect(authenServerEP);
        this.connected = true;
    }
    catch (SocketException retryConnectException)
    {
        if (false == retried)
        {
             retried = true;
        }
    }
}  
启动线程后,在父线程/主线程中,我继续循环并检查主窗体/对话框中声明的变量是否已连接

主线程的代码如下所示:

// Connect to the Authentication Server                             
new Thread(InitializeConnection).Start();
// Loop till connected
while (!this.connected)
{
     if ((true == this.retried) && (false == this.establishingConnectionForm.Visible))
     {
        this.establishingConnectionForm.Show();
     }
}
this.establishingConnectionForm.Dispose();
如果在InitilizeConnection代码中,它因为第一次失败而重试连接,我希望它显示一个新的对话框/表单,让用户知道它正在重试连接。当我在建立ConnectionForm(在父线程中)上使用.Show()方法时,它会显示对话框/表单,但不会正确显示。表单上的一些工具以白色阴影显示,鼠标图标变为思考/工作图标,不允许您单击表单并与其交互

我想象的是,我将能够显示表单并与之交互(即通过在右上角“X”将其关闭),然后将其四处移动等等。当建立连接时,我将中断主/父线程中的while(!this.connected)循环,然后关闭/处理建立连接表单

我已经尝试过在执行连接序列的线程上创建/初始化表单,但是我仍然得到了相同的结果,因为表单上的工具阴影化了,并且无法与之交互。使用.ShowDialog()方法可以使其正确显示并让我与之交互,但我不想阻止,因为我没有DialogResult。我希望表单在建立连接后自行关闭


我感谢您阅读我的帖子和您的任何意见:不要使用轮询循环。您正在将该线程绑定到循环中,这样它就不会发送任何事件。如果不调度事件,UI将不起作用

  • 使用ShowDialog显示连接窗体
  • 将对话框传递到connect函数中
  • 在连接后的连接线程中,使用以下代码:

    // Connect to the Authentication Server                             
    new Thread(InitializeConnection).Start();
    // Loop till connected
    while (!this.connected)
    {
         if ((true == this.retried) && (false == this.establishingConnectionForm.Visible))
         {
            this.establishingConnectionForm.Show();
         }
    }
    this.establishingConnectionForm.Dispose();
    
    Invoke(新的ThreadStart(delegate()) { form.Close(); }));

  • 您还可以使用或带有超时的事件来控制轮询间隔,并在每个超时间隔上更新进度显示(“正在连接”、“已连接”、“失败”),直到事件被“设置”


    或者类似的东西。

    在UI线程中不能像这样循环,它将无法执行绘制窗口和响应输入等基本任务。不要使用DoEvents(),这样当用户关闭主窗体时,代码将在没有任何用户界面的情况下运行。如果幸运的话,你会得到一个ObjectDisposedException


    解决方案是让线程通知UI线程连接有问题。您可以通过BackgroundWorker的ReportProgress事件干净地执行此操作。

    为什么不阻止?显示对话的线程没有任何作用。