C# 多线程代码与Form.ShowDialog()语句绑定

C# 多线程代码与Form.ShowDialog()语句绑定,c#,winforms,multithreading,C#,Winforms,Multithreading,我是C#的新手,当时正试图编写一个表单测试一个网络连接。其思想是将连接部分放在一个线程中,并在连接过程中显示一个进度对话框。以下是我的代码: Form_TestingConnection testingConnection = new Form_TestingConnection(); Thread t1 = new Thread(TestConnection); try { testingConnection.ShowDialog(); t1.Start(); } catch (Ex

我是C#的新手,当时正试图编写一个表单测试一个网络连接。其思想是将连接部分放在一个线程中,并在连接过程中显示一个进度对话框。以下是我的代码:

Form_TestingConnection testingConnection = new Form_TestingConnection();
Thread t1 = new Thread(TestConnection);

try
{
testingConnection.ShowDialog();
t1.Start();    
}
catch (Exception ex)
{
    Logger.Error(ex);
if (MessageBox.Show(
    Resources.message_connection_issue,
    Resources.title_connection_issue,
    MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK)
{
    loginSuccessful = false;
}
}
TestConnection是一种测试连接并基于结果设置静态成员LoginSucessful的方法。我现在遇到的问题是,testingConnection.ShowDialog()中的代码被卡住了。每当它执行到这个地方,它就永远不会前进。有什么建议吗?非常感谢。

以模式显示表单。这意味着表单将显示,所有其他表单将被禁用,
ShowDialog
功能将在模式对话框关闭之前不会返回

改用。这显示了无模式的表单。执行此操作时,
Show
函数立即返回,表单保持打开状态

您可以将
ShowDialog
视为同步,将
Show
视为异步

确保使用
Invoke
BeginInvoke
调用线程中需要更新表单进度的任何方法,以确保它们在主UI线程的上下文中运行


最后,您的代码不会等待线程完成其工作。try/catch块仅包装表单显示和线程执行的开始(
t1.Start()
)。在线程上调用
Start
时,该调用将异步返回,线程将继续执行其工作。我不太确定您的代码试图做什么,但我怀疑
catch
块应该在线程内部。

如果您试图从另一个线程访问属于某个线程的任何GUI组件,您应该使用invokererequired来避免跨线程异常

谢谢David!你的回答很有道理。这让我困惑了好几个小时。也许你想把你的线程移动到testingConnection表单,并在表单加载事件中启动它??