4

您可以在构造函数完成并加载主窗体之前退出应用程序吗?

在启动时,我有一个加载屏幕,在加载主窗体之前显示。在构造函数完成之前从构造函数显示加载屏幕。

我通过在主窗体和退出屏幕之间使用变量来对退出屏幕执行类似的操作。如果退出屏幕返回 true,我在主窗体中有一个应用程序退出。

最后,应该在主构造函数中完成所有线程/类/加载/程序设置还是我做错了?

更新:

我的意思是在 program.cs 和静态 main 之后

namespace app
{
 public partial class app1 : Form
 {
   public app1()
   {  
      InitializeComponent();
      // open loading screen
      // initialize vars
      // create objects
   }
 // form opens when app1() finishes
  1. app1()初始化一切的正确位置吗?
  2. 如果我在完成之前尝试从加载屏幕发回“关闭”消息app1(),则它不起作用 - 即使没有任何内容打开,该过程仍会运行。
4

6 回答 6

10

我发现,当我仍然在不同的线程上显示初始屏幕(看起来与您正在做的事情相似)时,如果我尝试从主表单构造函数中终止我的应用程序,那Application.Exit()不起作用,但Environment.Exit(-1)确实如此。

于 2009-06-14T11:57:59.650 回答
6

尝试这个,


    public partial class MyForm : Form
    {        
    public MyForm()
    {
     if (MyFunc())
        {
            this.Shown += new EventHandler(MyForm_CloseOnStart);
        }
    }

    private void MyForm_CloseOnStart(object sender, EventArgs e)
    {
         this.Close();
    }
    }

它会运作良好......

于 2011-07-22T02:22:36.200 回答
0

当主线程结束时:

  • 后台线程被“杀死/放弃”
  • 等待前台线程(创建线程时的默认设置)直到它们完成。
于 2009-04-08T12:44:49.370 回答
0

您只能通过抛出异常来破坏构造函数。要偷偷地做到这一点,请抛出您自己的特定异常。

class ConstructorAbortedException : Exception { }

class Foo
{
  public Foo()
  {
    if(goesWrong)
    {
      throw new ConstructorAbortedException();
    }
  }
}

void Bar()
{
  try
  {
    Foo f = new Foo();
  }
  catch(ConstructorAbortedException)
  {
    //..
  }
}
于 2009-04-08T12:50:51.350 回答
0

哪个类的哪个主要构造函数?

您是在谈论Main在类中具有默认位置的静态方法Program吗?

您可以使用该方法进行在屏幕上打开任何窗口之前需要进行的初始化。

显然,如果您需要使用加载屏幕,您可能需要将一些代码移动到其他地方,因为您需要围绕表单的消息循环,并且消息循环将阻塞,直到您的表单关闭。

如果在打开任何表单之前从 Main 方法返回,则不会明显显示任何表单。

说了这么多,我觉得你的问题有点含糊,我很确定我不明白你在问什么。

首先,Main它不是构造函数,它只是一个静态方法。

于 2009-04-08T07:49:43.540 回答
0

正如 jontsnz 回答的

Environment.Exit(-1)

那样,构造函数中的代码可以正常工作,但这会导致应用程序抛出“应用程序挂起”事件,这可以被视为 Windows 事件查看器中的错误。虽然使用

Environment.Exit(0)

退出而不注册错误,所以我更喜欢那个。

于 2017-07-26T14:13:03.127 回答