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