Вопрос по kill-process, c#, login, winforms – C # Winform Процесс все еще в диспетчере списка задач Windows после закрытия программы

0

Почему процесс по-прежнему в диспетчере списков задач Windows после закрытия программы?

я использую логин Form.cs

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

после успешного входа пользователя я перенаправляю на другую мастер-страницу

<code> this.Hide();
            Main_Usr oMainUsr = new Main_Usr();                    
            oMainUsr.Visible = true;
</code>

моя псевдо-мастер-страница выглядит так:

<code>public Main_Usr()
        {
            InitializeComponent();
            this.IsMdiContainer = true;
        }
</code>

когда я закрываю главную страницу, процесс все еще в диспетчере списка задач Windows. Но когда я закрываю страницу входа, это убивает процесс в диспетчере списка задач Windows.

это значит, что я просто скрываю страницу входа? я должен закрыть все окна, чтобы действительно выйти / убить процесс?

Заранее спасибо Стеф

вам просто нужно закрыть форму входа (примечание: форма, а не страница) Reniuz

Ваш Ответ

6   ответов
1

Login форма (Application.Run(new Login()) делает это), поэтому вам нужно закрыть форму, которая запустила приложение, чтобы завершить процесс.

Кроме того, вы можете просто позвонитьLoginForm.Show(), доApplication.Run, храните учетные данные где-нибудь, а затем позвонитеApplication.Run(new Main_Usr)

Посмотрите на ответ Лениберезовского, в частности на раздел «Обновление», есть фрагмент кода, показывающий, как это должно быть сделано.
Спасибо за ваш ответ. & APOS; [STAThread] static void Main () {Application.EnableVisualStyles (); Application.SetCompatibleTextRenderingDefault (ложь); Логин oLogin = новый Логин (); oLogin.Show (); Application.Run (новый Main_Usr ()); } & APOS; но это открыть главную страницу перед процедурой входа user609511
3

когда основная форма заявки будет закрыта. Основная форма заявки - та, которая указана в Application.Run call. В вашем случае это форма авторизации:

Application.Run(new Login());

Чтобы закрыть форму вы должны позвонитьClose метод. Когда вы звоните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 обработчик события. Это зависит от вас.

Кстати нет мастер-страниц и страниц в winforms. Это все для ASP.NET. Здесь у вас есть формы :) Также подумайте об именах, таких как LoginForm, MainForm и т. Д.

0

  private void simpleButton_Valider_Click(object sender, EventArgs e)
        {
       .....
          DialogResult = DialogResult.OK;
                    return;
       .....
   }
0

Login последняя форма приложения, которое вы закрываете, вы загружаетеMain_User только после этого - даже еслиLogin он по-прежнему скрыт. Приложения Windows Forms по умолчанию настроены на выход при закрытии последней формы.

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 внутри окна входа.

Кстати, у вас есть многопоточность внутри? Это еще один источник ошибок этого типа.

У вас есть форма для входа, просто добавьтеpublic bool Passed{get;set;} и установите это значение при успешном входе в систему.
Спасибо за ваш ответ, но я не могу получить l.Passed user609511
0

 [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Login oLogin = new Login();
            oLogin.ShowDialog();
            Application.Run(new Main_Usr());
        }
В этом случае Main_Usr будет отображаться всегда. Был ли логин действительным или нет. Проверьте, если вход был успешным, прежде чем показывать Main_User

Похожие вопросы