【问题标题】:Can I close the program from the Main constructor?我可以从 Main 构造函数中关闭程序吗?
【发布时间】:2010-10-18 06:05:05
【问题描述】:

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

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

我通过在主窗体和退出屏幕之间使用变量来对退出屏幕执行类似的操作。如果退出屏幕返回 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() 完成之前从加载屏幕发回“关闭”消息,它不起作用 - 即使没有任何内容打开,该进程仍然运行。

【问题讨论】:

    标签: c# multithreading screen loading main


    【解决方案1】:

    哪个类的主构造函数?

    您说的是在Program 类中具有默认位置的静态方法Main

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      当主线程结束时:

      • 后台线程被“杀死/放弃”
      • 等待前台线程(创建线程时的默认设置)直到它们完成。

      【讨论】:

        【解决方案3】:

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

        class ConstructorAbortedException : Exception { }
        
        class Foo
        {
          public Foo()
          {
            if(goesWrong)
            {
              throw new ConstructorAbortedException();
            }
          }
        }
        
        void Bar()
        {
          try
          {
            Foo f = new Foo();
          }
          catch(ConstructorAbortedException)
          {
            //..
          }
        }
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            试试这个,

            
                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();
                }
                }
            

            它会很好用......

            【讨论】:

            • 同样的事情使用 lambda:Shown += (sender, e) => Close();
            【解决方案6】:

            正如 jontsnz 回答的那样,代码与

            Environment.Exit(-1)

            在构造函数中工作正常,但这会导致应用程序引发“应用程序挂起”事件,这在 Windows 事件查看器中可以被视为错误。使用

            Environment.Exit(0)

            虽然没有注册错误就退出了,所以我更喜欢那个。

            【讨论】:

              猜你喜欢
              • 2011-04-08
              • 1970-01-01
              • 2015-02-14
              • 1970-01-01
              • 2011-04-21
              • 2013-09-27
              • 1970-01-01
              • 2010-09-23
              相关资源
              最近更新 更多