多线程代码被Form.ShowDialog()语句卡住了

本文关键字:语句 代码 Form ShowDialog 多线程 | 更新日期: 2023-09-27 18:10:22

我是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()。无论何时执行到这个地方,它都不会前进。有什么建议吗?非常感谢。

多线程代码被Form.ShowDialog()语句卡住了

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

Show代替。这显示了表单的非模态性。当您这样做时,Show函数立即返回并且窗体保持打开状态。

可以认为ShowDialog是同步的,Show是异步的。

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

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

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