多线程代码卡在Form.ShowDialog()语句中

时间:2011-10-03 12:49:00

标签: c# winforms multithreading

我是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是一种测试连接的方法,并根据结果设置静态成员loginSuccessful。我现在遇到的问题是代码卡在了testingConnection.ShowDialog()。每当它执行到这个地方时,它永远不会前进。有什么建议?非常感谢。

2 个答案:

答案 0 :(得分:4)

ShowDialog以模态方式显示表单。这意味着表单将显示,所有其他表单将被禁用,ShowDialog函数将不会返回,直到模式对话框关闭。

请改用Show。这表明形式无模式。当你这样做时,Show函数立即返回,表单保持打开状态。

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

确保使用InvokeBeginInvoke调用线程中需要更新表单上进度的所有方法,以确保它们在主UI线程的上下文中运行。

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

答案 1 :(得分:0)

如果您尝试访问属于另一个线程的线程的任何GUI组件,您应该使用 InvokeRequired 来避免交叉线程异常