在Application.Run完成之前处置.NET应用程序

时间:2010-08-14 18:33:20

标签: .net dispose windows-forms-designer

我有一个项目,当没有传递正确的命令行参数时显示UI。它是一个简单的实用程序,用于动态更新桌面墙纸。完成更新后,我打电话给

this.Dispose();

但如果传递命令行参数,则会导致问题。表单实际上最终在向用户显示之前获取Dispose方法调用。结果是一个令人讨厌的错误,说程序无法正常运行,即使它按我想要的那样运行。

我可以尊重我对此不太合乎逻辑,但我不知道另一种方法来查看解决方案。是否有另一种方法可以在加载应用程序之前干净地调用Dispose()方法而不会导致错误?

其他信息:

上述情况显然不明确,我为此道歉。我的程序是从Program.cs文件启动的:

Application.Run(new MainForm());

在构造函数中,我检查命令行参数是否存在,如果存在,则调用一个名为SilentRun的例程。此私有方法检查参数是否有效,如果是,则将它们传递给方法以提交名为BrandSystem()的操作。

在BrandSystem()完成后,最后一个语句是

this.Dispose();

因为应用程序没有其他功能可以实际执行。如果没有传递命令参数并且用户使用GUI来应用更改,则调用相同的方法。基本上,一旦更新壁纸的过程完成,我希望应用程序自行终止。

命令行参数的原因是,可以将此实用程序的排序添加到安装包并在后台静默运行。我的安装过程没有更新壁纸的原生功能,这对我来说是一个双鸟一石。

当程序在命令行模式下运行并在实际加载所有内容之前调用Dispose时会出现问题。即使他们证明我的逻辑完全不合理,我也愿意接受建议。

2 个答案:

答案 0 :(得分:1)

为什么不标记它,等到它已加载,然后退出应用程序? Dispose用于特定任务:从非托管对象中回收资源。

答案 1 :(得分:1)

我看不到你的所有代码,但是你的程序在静默模式下运行时是否有必要调用Application.Run?如果你取消了启动GUI,那么你不必担心处理它。

我可以这样做:

// In main method

if (runningInSilentMode)
{
    // Run the app in silent mode
    // Do core behavior based on arguments, don't call Application.Run
}
else
{
    // Run the app in interactive mode
    // Do core behavior based on the user's input
    Application.Run(new MainForm());
}

当然,这假设您的核心程序逻辑未与GUI集成。如果它与您的GUI集成,您将需要进行一些重构以将其分开。