2013-08-04 2 views
4

У меня есть одна форма MDIPrent, которая является моей основной формой. Теперь я выхожу из формы Main_Form, щелкнув LogOut MenuStrip. В моем коде я предотвратил дубликат экземпляра. Но я получаю эту ошибку. Я так много искал Google, много чего делал, но ошибка не исчезла. Ниже код Program.cs файла:Запуск второго цикла сообщений в одном потоке не является допустимой операцией. Используйте Form.ShowDialog вместо

using System.Diagnostics; 
static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     LoggedInUser = string.Empty; 
     loginSuccess = false; 
     String thisprocessname = Process.GetCurrentProcess().ProcessName; 
     if (Process.GetProcesses().Count(p => p.ProcessName == thisprocessname) > 1) 
      return; 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     MyApplicationContext context = new MyApplicationContext(); 
     Application.Run(context); 

    } 
    public class MyApplicationContext : ApplicationContext 
    { 
     private Login_Form lgFrm = new Login_Form(); 
     public MyApplicationContext() 
     { 
       try 
       { 
        lgFrm.ShowDialog(); 
        if (lgFrm.LogonSuccessful) 
        { 
         ////lgFrm.Close(); 
         lgFrm.Dispose(); 
         FormCollection frm = Application.OpenForms; 
         try 
         { 
          foreach (Form fc in frm) 
           fc.Close(); 
         } 
         catch (Exception ex){} 
         Application.Run(new Main_Form()); 
        } 
       } 
       catch (Exception ex){} 
      } 
     } 
} 

Ниже приведен код для login_form

public bool LogonSuccessful 
    { 
     get 
     { 
      return Program.loginSuccess; 
     } 

     set 
     { 
      Program.loginSuccess = value; 
     } 
    } 

    private void BtnEnter_Click(object sender, EventArgs e) 
    { 
     Login_Form lgn = new Login_Form(); 
     Program.loginSuccess = true; 
     this.Hide(); 
     Program.LoggedInUser = TxtBxUserName.Text; 
    } 

Ниже для Main_Form

private void LogOutMenuItem_Click(object sender, EventArgs e) 
    { 
     Login_Form lgFrm = new Login_Form(); 
     lgFrm.LogonSuccessful = false; 
     Program.loggedOut = true; 
     Program.LoggedInUser = string.Empty; 
     this.Close(); 
     ////FormCollection frm = Application.OpenForms; 

     ////foreach (Form fc in frm) 
     ////{ 
     //// MessageBox.Show(fc.ToString()); 
     ////} 

     Program.MyApplicationContext context = new Program.MyApplicationContext(); 
     Application.Run(context); 
    } 

Я использовал контекст, потому что я хочу make Main_Form, единственный OpenForm приложения. Где-то у меня появилась идея использовать контекст.

+0

создать новый процесс вместо Application.Run (контекст); это не отличное решение, но я напишу, если вы скажете мне, почему вы делаете Application.Run() в первую очередь –

+0

Должен ли я создать процесс на logOut или вместо Application.Run()? И я вообще делаю Application.Run(), чтобы запустить приложение. – DhavalR

+0

Что вы пытаетесь достичь –

ответ

0

попробовать это: вместо стрельбы новое приложение при входе, как раз отчуждать свое окно и заменить MyApplicationContext() в этом:

public MyApplicationContext() 
    { 
     bool isSuccessful = false; 
     do 
     { 
      try 
      { 
       lgFrm = new Login_Form(); 
       lgFrm.ShowDialog(); 
       if (lgFrm.LogonSuccessful) 
       { 
        isSuccessful = lgFrm.LogonSuccessful; 
        ////lgFrm.Close(); 
        lgFrm.Dispose(); 
        FormCollection frm = Application.OpenForms; 
        try 
        { 
         foreach (Form fc in frm) 
          fc.Close(); 
        } 
        catch (Exception ex){} 
        Application.Run(new Main_Form()); 
       } 
      } 
      catch (Exception ex){} 
     }while(isSuccessful); 
    } 
+0

Данная же ошибка появляется в том же месте. Login_Form просто вспыхнул и ОШИБКА. – DhavalR

+0

Где именно вы получаете сообщение об ошибке cus 'просто запускает программу с использованием этого кода и не получил ошибку. вы удалили Application.Run (контекст); ? –

+0

Я получаю его на Application.Run (new Main_Form()); в MyApplicationContext. – DhavalR

3

Ваше исключение происходит потому, что вы называете Application.Run(...) внутри другого Application.Run(...), изменить следующим образом:

//MyApplicationContext constructor 
public MyApplicationContext() 
    { 
      try 
      { 
       lgFrm.ShowDialog(); 
       if (lgFrm.LogonSuccessful) 
       { 
        ////lgFrm.Close(); 
        lgFrm.Dispose(); 
        FormCollection frm = Application.OpenForms; 
        try 
        { 
         foreach (Form fc in frm) 
          fc.Close(); 
        } 
        catch (Exception ex){} 
        //Application.Run(new Main_Form()); <<<---- Remove this 
        MainForm = new Main_Form(); 
       } 
      } 
      catch (Exception ex){} 
      //Add the ThreadExit event handler here 
      ThreadExit += (s,e) => { 
       if(Program.loggedOut) { 
       Program.MyApplicationContext ctxt = new Program.MyApplicationContext(); 
       Application.Run(ctxt); 
       } 
      }; 
     } 
    } 
// 
private void LogOutMenuItem_Click(object sender, EventArgs e) 
{ 
    Login_Form lgFrm = new Login_Form(); 
    lgFrm.LogonSuccessful = false; 
    Program.loggedOut = true; 
    Program.LoggedInUser = string.Empty; 
    this.Close(); //I think you want to call Application.Restart() here? 
        //if so, you don't need the ThreadExit event handler added in the MyApplicationContext() constructor. 
} 
+0

в Main() Я вызываю Application.Run (контекст); Хорошо работает. Но когда я пытаюсь выйти из системы, появляется ошибка. – DhavalR

+0

@DhavalR только потому, что у вас есть строка 'Application.Run (context)' в 'LogOutMenuItem_Click', зачем она вам нужна? просто удалите его, если вы хотите показать какую-то форму, покажите его напрямую. –

+0

Application.Run() также находится в Main(). Потому что я не хочу, чтобы Login_Form оставался открытым после LoginSuccess. И LoginForm.ShowDialog() находится в контексте (т. Е. В Program.cs. См. Код в вопросе). – DhavalR

0

я была такая же проблема

лучший способ решить это с помощью

Application.Restart(); 

вы должны использовать его, когда когда-либо пользователь Выйдите из системы, поэтому основной интерфейс близко

и журнал в диалоговом окне появятся !!

но Вход в форме U должен использовать этот

ControlBox = False; 

поэтому пользователь не может обойти его, закрыв его !! Просто U можно добавить кнопку Выход с кодом

Application.Exit(); 

это, как я решил эту проблему без каких-либо дополнительных Usings или ошибок ...

Смежные вопросы