如果这是一个大型项目,请立即投入时间对其进行重构。
- 考虑一个 MVC 模式。您可以使用 WinForms 来做些什么,而不仅仅是更新的 UI 技术。
- 如果你不选择 WinForms,至少要分离 UI 和数据(数据绑定是你的朋友)。
- 当不同的表单共享通用功能时,构建可重用的组件。
与 WinForms 的工作方式作斗争在中期将比现在投入时间做正确的事情要昂贵得多。
如果您对该技术有任何选择,请考虑 WPF。WPF 有一个学习曲线,但现在可能值得投资于该学习。
更新
根据您的代码示例,我看到您可能正在主 UI 线程以外的线程上创建一些表单。虽然这是允许的,但它会创建非常混乱的代码,因为表单只能从创建它们的线程更新。
最简单的破解方法可能是更新HandleIncomingData
以调用Show()
主 UI 线程上的调用。
应该有一种方法可以从静态方法中干净地做到这一点,如下所述:
https://stackoverflow.com/a/505361/141172
但是,当我尝试这样做时,我发现它SynchronizationContext
始终为空。我确定我只是少了一步。
我能够通过滥用LoginForm
(假设,也许是错误的,该表单始终可用。如果没有,也许创建一个仅用于线程编组的特殊表单)。
黑客看起来像这样:
Program.MainForm = new MainForm();
try
{
MessageBox.Show("Login Success.", "Login", MessageBoxButtons.OK, MessageBoxIcon.Information);
// Abusing LoginForm's Invoke method. Code assumes LoginForm is always available.
Program.LoginForm.Invoke((MethodInvoker)delegate
{
Program.MainForm.Show();
});
}
catch (Exception Ex)
{
MessageBox.Show(Ex.ToString()); //Debuging purposes
}
顺便说一句,有一个出色的扩展方法可以让从非 UI 线程调用 UI 代码变得轻而易举:
https://stackoverflow.com/a/3588137/141172