2013-06-20 12 views
6

Na samym początku mojego programu sprawdzam, czy mogę zainicjować połączenie z urządzeniem na COM6. Jeśli urządzenie nie zostanie znalezione, chcę wyświetlić MessageBox, a następnie całkowicie zakończyć program.Program końcowy po zamknięciu MessageBox

Oto co mam do tej pory w funkcji Main() początkowego programu:

try 
{ 
    reader = new Reader("COM6"); 
} 
catch 
{ 
    MessageBox.Show("No Device Detected", MessageBoxButtons.OK, MessageBoxIcon.Error) 
} 

Application.EnableVisualStyles(); 
Application.SetCompatibleRenderingDefault(false); 
Application.Run(new Form1()); 

gdy próbuję oddanie Application.Exit(); po komendzie MessageBox, wyświetlacze MessageBox poprawnie, gdy zostanie wykryty żadne urządzenie, ale kiedy zamknij MessageBox, Form1 nadal się otwiera, ale jest całkowicie zamrożony i nie pozwoli mi go zamknąć ani kliknąć żadnego z przycisków, które powinny dać mi błąd, ponieważ urządzenie nie jest podłączone.

Po prostu szukam, żeby całkowicie zabić program po wyświetleniu okna MessageBox. Dzięki.

ROZWIĄZANIE: Po użyciu metody return; po MessageBox zamknięty program rzucić tak jak chciałem, gdy urządzenie nie zostało podłączone go. Jednakże, gdy urządzenie było podłączone, nadal miało problemy z odczytem po przetestowaniu. To było coś, czego wcześniej nie odkryłem, ale było to proste rozwiązanie. Oto mój w pełni działający kod:

try 
{ 
    test = new Reader("COM6"); 
    test.Dispose(); //Had to dispose so that I could connect later in the program. Simple fix. 
} 
catch 
{ 
    MessageBox.Show("No device was detected", MessageBoxButtons.OK, MessageBoxIcon.Error) 
    return; 
} 
Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 
Application.Run(new Form1()); 

Odpowiedz

5

Ponieważ jest to w rutynę Main(), po prostu wrócić:

try 
{ 
    reader = new Reader("COM6"); 
} 
catch 
{ 
    MessageBox.Show("No Device Detected", MessageBoxButtons.OK, MessageBoxIcon.Error) 
    return; // Will exit the program 
} 

Application.EnableVisualStyles(); 
//... Other code here.. 

Wracając z Main() wyjdzie proces.

+0

To było proste. Dzięki za pomoc. – VarnerBeast14

+0

Ta odpowiedź powinna dodać więcej wyjaśnień, dlaczego 'Application.Exit()' nie działa zgodnie z wyjaśnieniami 'Jan Doerrenhaus' –

2

Dodaj do góry boolean, aby określić, czy operacja została zakończona.

bool readerCompleted = false; 
try 
{ 
    reader = new Reader("COM6"); 
    readerCompleted = true; 
} 
catch 
{ 
    MessageBox.Show("No Device Detected", MessageBoxButtons.OK, MessageBoxIcon.Error) 
} 

if(readerCompleted) 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

Ponieważ nie ma kodu po oświadczeniu if, program będzie po prostu blisko, gdy wartość logiczna jest fałszywe.

Można zastosować ten rodzaj logiki do dowolnej innej sekcji kodu, a nie tylko do funkcji Main().

+0

To działało na to, co początkowo chciał, ale teraz program nie będzie działać, gdy urządzenie jest podłączone. Zamierzam grać z tym trochę, ale dzięki za pomoc w rozwiązaniu pierwotnego problemu. – VarnerBeast14

6

Application.Exit mówi aplikacji WinForms o zatrzymaniu pompy komunikatów, a tym samym o wyjściu z programu. Jeśli zadzwonisz, zanim zadzwonisz pod numer Application.Run, pompa komunikatów nigdy nie będzie musiała się uruchamiać, więc zawiesi się.

Jeśli chcesz zakończyć swój program, bez względu na to, w jakim stanie, użyj Environment.Exit.

+0

Prawdopodobnie nie to, czego potrzebuję tutaj, ale jest to przydatne, aby wiedzieć, jakie mogą być przyszłe problemy. Szukałem tego rodzaju kodu typu "zabij wszystko". – VarnerBeast14

0

Można umieścić Application.Exit() po kodzie okno komunikatu
catch
{
MessageBox.Show("No Device Detected", MessageBoxButtons.OK, MessageBoxIcon.Error")
Application.Exit();
}

Powiązane problemy