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将不起作用
// 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事件干净地执行此操作。为什么不阻止?显示对话的线程没有任何作用。