我可以从Main构造函数关闭程序吗?

时间:2009-04-08 07:45:34

标签: c# multithreading screen loading main

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

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

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

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

更新

我的意思是在program.cs和static 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()完成之前从加载屏幕发回“关闭”消息,则它不起作用 - 即使没有打开任何内容,该过程仍会继续运行。

6 个答案:

答案 0 :(得分:10)

我发现如果我尝试从主窗体构造函数中删除我的应用程序,当我仍然在不同的线程上显示启动画面时(看起来与你正在做的类似),Application.Exit()不起作用,但Environment.Exit(-1)确实如此。

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

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

答案 2 :(得分:0)

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

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

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

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

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

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

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

答案 3 :(得分:0)

主线程结束时:

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

答案 4 :(得分:0)

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

class ConstructorAbortedException : Exception { }

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

void Bar()
{
  try
  {
    Foo f = new Foo();
  }
  catch(ConstructorAbortedException)
  {
    //..
  }
}

答案 5 :(得分:0)

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

Environment.Exit(-1)

在构造函数中工作正常,但这会导致应用程序抛出一个" Application Hang"事件,可以在Windows事件查看器中看作错误。运用

Environment.Exit(0)

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