gpt4 book ai didi

c# - 使用 .Show 无法正确显示对话框,但不想在 C# 中多线程时阻塞 .ShowDialog

转载 作者:行者123 更新时间:2023-11-30 22:48:06 26 4
gpt4 key购买 nike

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

连接顺序代码如下:

// 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 代码中重试连接,因为它第一次失败,我希望它显示一个新的对话框/表单,让用户知道它正在重试连接。当我在 establishingConnectionForm 上使用 .Show() 方法(在父线程中)时,它会弹出对话框/表单,但显示不正确。表单上的一些工具显示为白色,鼠标图标变为思考/工作图标,不允许您单击表单并与之交互。

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

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

感谢您阅读我的主题以及您的任何意见。 :D

最佳答案

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

解决方案是让线程通知 UI 线程它在建立连接时遇到问题。您可以使用 BackgroundWorker 的 ReportProgress 事件干净地做到这一点。

关于c# - 使用 .Show 无法正确显示对话框,但不想在 C# 中多线程时阻塞 .ShowDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1911634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com