我的c#windows表单应用程序有5个表单,我一个接一个地显示。当用户点击下一个按钮时,我给出的代码是:
new Form1().Show();
this.Hide();
但是我不想隐藏我当前的表格。我想关闭它/处理它,以便它不消耗内存。我希望尽快释放其资源,例如图像和变量。 为此,我尝试实施:
new Form1().Show();
this.Close(); //Form 2
但这只是关闭两种形式。 我甚至尝试交换上面两行的位置:
this.Close();
new Form1().Show();
但这也是一样的。
如何在完成后立即释放一个表单的资源?因为当我尝试使用:
重新打开表单2时,我的程序会抛出内存异常new Form2().Show();
this.Hide();
答案 0 :(得分:4)
您可以在新的NewForm
中启动thread
并创建新的消息循环
当主消息循环关闭时,应用程序退出。在Windows窗体中,当调用Exit方法时,此循环将关闭
有关详细信息,请参阅here。
var th = new Thread(() => Application.Run(new NewForm()));
th.SetApartmentState(ApartmentState.STA); // Deprecation Fix
th.Start();
this.Close();
答案 1 :(得分:2)
另一种方法是自己管理应用程序上下文。这是一个小型演示:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
using (var myApplicationContext = new MyApplicationContext(new Form1()))
{
Application.Run(myApplicationContext);
}
}
您可以通过以下方式定义定制的ApplicationContext
:
public class MyApplicationContext : ApplicationContext
{
public MyApplicationContext(Form mainForm)
:base(mainForm)
{
}
protected override void OnMainFormClosed(object sender, EventArgs e)
{
if (Form.ActiveForm != null)
{
this.MainForm = Form.ActiveForm;
}
else
{
base.OnMainFormClosed(sender, e);
}
}
}
现在,您可以在Button.Click
事件处理程序上执行以下操作:
var f = new Form();
f.Show();
this.Close();
应用程序将继续运行。基本上这种方式可以使应用程序保持活动状态,同时至少有一个活动表单。
注意 尚未对其进行测试,但它应该有效。
答案 2 :(得分:1)
关闭程序在其主函数中启动的表单将关闭应用程序,一个想法是拥有一个父表单并使其成为主表单,并且永远不关闭它,如果你愿意,这可以是一个隐藏的表单。 / p>
我很久以前不使用Windows窗体,但在此页面上找到了您获得的行为背后的原因:
http://msdn.microsoft.com/en-us/library/ms157902(v=vs.110).aspx
通常,应用程序的主要功能调用此方法和 将应用程序的主窗口传递给它。这个方法增加了一个 Closed事件的mainForm参数的事件处理程序。该 事件处理程序调用ExitThread来清理应用程序。
同样在这个问题上How do I prevent the app from terminating when I close the startup form?讨论了同样的问题
答案 3 :(得分:1)
我不确定它是否适合你。但是当我在处理登录表单时遇到同样的问题...我只是使用ShowDialog()而不是Show(),(对我来说它解决了问题)就像:
this.Hide();
MainForm MForm = new MainForm();
MForm.ShowDialog();
this.Close();
答案 4 :(得分:0)
默认情况下,C#Forms应用程序会创建一个" root"在Program.Main()方法中形成并将其传递给Application.Run()方法。当此表格关闭时,您的程序将退出。
但是,您可以使用不同的Application.Run()重载来更改此行为。只是不要将Form实例传递给Run()。相反,在调用Application.Run()之前显示表单,然后稍后(当您最终希望程序退出时)使用Application.ExitThread()方法告诉Application类您已准备好关闭应用