多线程代码被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()。无论何时执行到这个地方,它都不会前进。有什么建议吗?非常感谢。
ShowDialog
以模态方式显示表单。这意味着表单将显示,所有其他表单将被禁用,并且ShowDialog
函数将不会返回,直到模态对话框关闭。
用Show
代替。这显示了表单的非模态性。当您这样做时,Show
函数立即返回并且窗体保持打开状态。
可以认为ShowDialog
是同步的,Show
是异步的。
确保线程中任何需要更新表单进度的方法都使用Invoke
或BeginInvoke
调用,以确保它们在主UI线程的上下文中运行。
最后,你的代码不会等待直到线程完成它的工作。try/catch块只包装表单显示和线程执行的开始(t1.Start()
)。当您在一个线程上调用Start
时,调用异步返回,线程继续做它的工作。我不太确定你的代码要做什么,但我怀疑catch
块应该在线程内。
如果你试图从另一个线程访问任何属于一个线程的GUI组件,你应该使用 invokerequirequired 以避免跨线程异常