0

プログラムを閉じた後もプロセスが Windows タスク リスト マネージャーに残っているのはなぜですか?

ログインForm.csを使用します

 [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Login());
        }

ユーザーが正常にログインした後、別のマスターページにリダイレクトします

 this.Hide();
            Main_Usr oMainUsr = new Main_Usr();                    
            oMainUsr.Visible = true;

このような私の擬似マスターページ:

public Main_Usr()
        {
            InitializeComponent();
            this.IsMdiContainer = true;
        }

マスターページを閉じると、プロセスはまだ Windows タスク リスト マネージャーにあります。しかし、ログイン ページを閉じると、Windows タスク リスト マネージャーのプロセスが強制終了されます。

ログインページを非表示にするだけなので、それはどういう意味ですか? プロセスを本当に終了/強制終了するには、すべてのウィンドウを閉じる必要がありますか?

前もってありがとう、スティーブ

4

6 に答える 6

3

メインアプリケーションフォームが閉じられると、winforms プロセスが強制終了されます。メインのアプリケーション フォームは、Application.Run 呼び出しで指定されたものです。あなたの場合、それはログインフォームです:

Application.Run(new Login());

フォームを閉じるには、Closeメソッドを呼び出す必要があります。呼び出すかfalse にHide設定すると、フォームはメモリに残ります。Visibilityユーザーから隠されるだけです。

したがって、必要な機能を実現するには、メイン アプリケーション フォームを Main_Usr に変更する必要があります。

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Main_Usr()); // change main form
}

次にLoad、Main_User フォームのイベントにサブスクライブします。そして、イベント ハンドラーで次の操作を行います。

private void Main_User_Load(object sender, EventArgs e)
{
    using (var loginForm = new Login())
    {
        Hide(); // hide main form

        if (loginForm.ShowDialog() != System.Windows.Forms.DialogResult.OK)
        {
            Close(); // close main form and kill process
            return;
        }

        Show(); // show main form if user logged in successfully 
    }
}

更新:このように、これをすべて Main メソッドで行うことができます

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    using(var loginForm = new Login())
         if (loginForm.ShowDialog() != System.Windows.Forms.DialogResult.OK)
             return;
    Application.Run(new Main_Usr()); // change main form
}

しかし、通常はメイン フォームを非表示にせず、ログイン フォームの下に表示します。したがって、この場合はLoadイベント ハンドラを使用する必要があります。それはあなた次第です。

ところで、winform にはマスターページとページはありません。これはすべて ASP.NET 用です。ここにフォームがあります:) LoginForm、MainFormなどの名前付けも検討してください。

于 2012-04-25T09:23:50.843 に答える
1

これは、アプリケーション メッセージ ループがLoginフォームに関連付けられている (Application.Run(new Login())これを行う) ためです。プロセスを終了するには、アプリケーションを開始したフォームを閉じる必要があります。

LoginForm.Show()または、 を呼び出す前にApplication.Run、資格情報をどこかに保存してから呼び出すこともできますApplication.Run(new Main_Usr)

于 2012-04-25T08:59:42.070 に答える
0

私は@lazyberezovskyのコードに従い、Login.csにこれを追加します

  private void simpleButton_Valider_Click(object sender, EventArgs e)
        {
       .....
          DialogResult = DialogResult.OK;
                    return;
       .....
   }
于 2012-04-26T08:01:20.503 に答える
0

私はそれを見つけました、私はdizlogを使用しています。

 [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Login oLogin = new Login();
            oLogin.ShowDialog();
            Application.Run(new Main_Usr());
        }
于 2012-04-25T09:24:25.413 に答える
0

Loginはアプリケーションを閉じる最後のフォームであるため、Main_Userその後にのみロードしますLogin。Windows フォーム アプリケーションは既定で、最後のフォームが閉じられたときに終了するように構成されています。

于 2012-04-25T08:59:10.180 に答える
0
this.Hide()

ウィンドウを殺しません。

したがって、それは隠されたままで、プロセスはメモリに残ります。this.Close() はウィンドウを閉じ、そのオブジェクトをメモリから削除します。

このようなことをする方が良いです:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    var l = new Login();
    l.ShowDialog();
    if(l.Passed)
       Application.Run(new Login());
}

ログインウィンドウ内に Passed プロパティを実装します。

ところで、内部にマルチスレッドはありますか? これは、このタイプのエラーの別の原因です。

于 2012-04-25T09:05:09.820 に答える