启动WinForm时“无法访问已处置对象”错误

时间:2013-11-25 17:08:26

标签: .net winforms automation

我有许多应用程序检查参数的命令行,启动WinForm,然后如果设置了标志运行进程并关闭表单。因此,我可以无人监督地运行该过程。

我注意到有几个这样的应用程序在无人监督的情况下运行失败,尽管它们与十几个其他应用程序具有相同的结构,并且在我手动运行它们时运行正常。

要重新创建问题:

static void Main()
    {
    bool  _unsupervised = ParseCommandLine();
    Application.Run(new FormUI(_unsupervised));
    }

class FormUI: Form
    {
    public FormUI(bool unsupervised)
        {
        _unsupervised = unsupervised;
        if (_unsupervised)  Start();
        }
    public void  Start()
        {
        // Do stuff
        if (_unsupervised)  Close();
        }
    private bool  _unsupervised;
    }

结果:Application.Run()抛出ObjectDisposedException:“无法访问已处置的对象”。

类似:How do I dispose a form in a WinForms application?

1 个答案:

答案 0 :(得分:1)

这些问题应用与其他应用之间的区别在于我是将Start()(因此,Close()的代码路径)放在构造函数还是Load()方法中。通过前者,表单在应用程序可以使用Application.Run()启动之前创建并自行处理。

关键是在构造函数完成后将此操作移动到某个点,例如OnLoad事件。这种调整可以解决问题:

static void Main()
    {
    bool  _unsupervised = ParseCommandLine();
    Application.Run(new FormUI(_unsupervised));
    }

class FormUI: Form
    {
    public FormUI(bool unsupervised)
        {
        this.Load += new System.EventHandler(this.FormUI_Load);
        _unsupervised = unsupervised;
        }
    public void  Start()
        {
        // Do stuff
        if (_unsupervised)  Close();
        }
    private bool  _unsupervised;

    private void  FormUI_Load(object sender, EventArgs args)
        {
        // Key change
        if (_unsupervised)  Start();
        }
    }

现在Start() .. Close()路径仅在完全创建表单后才会出现。