代码之家  ›  专栏  ›  技术社区  ›  Jeff

在应用程序之前释放.NET应用程序。运行完成

  •  0
  • Jeff  · 技术社区  · 16 年前

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

    this.Dispose();
    

    但如果传递命令行参数,则会导致问题。表单实际上在显示给用户之前得到了Dispose方法调用。结果是一个严重的错误,它说这个程序不能正常运行,即使它按照我的意愿运行。

    我可以尊重这样一点:我对这个问题不是很有逻辑性,但是我没有其他的方法来寻找解决方案。在应用程序加载之前,是否有其他方法可以在不导致错误的情况下干净地调用Dispose()方法?

    其他信息:

    以上内容显然不清楚,对此我深表歉意。我的程序是从program.cs文件启动的:

    Application.Run(new MainForm());
    

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

    在brandSystem()完成其工作后,最后一条语句是

    这个(处理);
    

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

    命令行参数的原因是这样排序的实用程序可以添加到安装包中,并在后台静默运行。我的安装过程没有更新墙纸的本地功能,这是一个二鸟一石实用程序。

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

    2 回复  |  直到 16 年前
        1
  •  1
  •   Zach Johnson    16 年前

    我看不到你所有的代码,但你的程序有什么必要调用的原因吗 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集成。如果它与您的图形用户界面相集成,您将需要进行一些重构来分离它。

        2
  •  1
  •   Rushyo    16 年前

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