我有许多应用程序检查参数的命令行,启动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
:“无法访问已处置的对象”。
答案 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()
路径仅在完全创建表单后才会出现。