จะออกจากแอปพลิเคชัน C # อย่างถูกต้องได้อย่างไร?


198

ฉันมีแอปพลิเคชันที่เผยแพร่ใน C # ปัญหานี่คือเมื่อใดก็ตามที่ฉันปิดแบบฟอร์มหลักโดยคลิกที่ปุ่มออกสีแดงมันปิดแบบฟอร์ม แต่มันไม่ได้ปิดแอปพลิเคชัน ฉันพบสิ่งนี้เมื่อฉันพยายามปิดเครื่องคอมพิวเตอร์หวังว่าแอปพลิเคชันที่ฉันทำนั้นทำงานได้อย่างราบรื่นแล้วฉันก็ถูกระดมยิงด้วยหน้าต่างเด็กจำนวนมากที่ฉันใส่MessageBoxAlerts ไว้

ฉันพยายามApplication.Exitแต่ก็ยังคงเรียกหน้าต่างลูกทั้งหมดและการแจ้งเตือนและฉันไม่ทราบวิธีการใช้Environment.Exitและจำนวนเต็มที่จะใส่เข้าไป

อย่างไรก็ตามเมื่อใดก็ตามที่แบบฟอร์มของฉันเรียกformclosedหรือform closingเหตุการณ์ฉันปิดแอปพลิเคชันด้วยthis.Hide()ฟังก์ชัน สิ่งนี้มีผลกระทบต่อการทำงานของแอปพลิเคชันของฉันหรือไม่


2
อย่าจัดการกับ FormClosed หรือ FormClosing
SLaks

1
คุณบอกว่าคุณซ่อนแบบฟอร์มไว้แทนที่จะปิดมัน? นั่นอาจเป็นเหตุผลที่แอปพลิเคชันไม่ได้ยกเลิก แต่ก็ยังมีรูปแบบเปิด (ซ่อน)
Xint0

จากนั้นฉันควรแทนที่ทั้งหมดนี้ซ่อน () เป็น this.Close ()?
John Ernest Guadalupe

1
คุณไม่จำเป็นต้องซ่อน () หรือปิด ()
Henk Holterman

1
โพสต์รหัสที่เกี่ยวข้องกับการปิดการกระทำและกิจกรรม
Henk Holterman

คำตอบ:


330

จาก MSDN:

Application.Exit

แจ้งปั๊มข้อความทั้งหมดว่าต้องยกเลิกแล้วปิดหน้าต่างแอปพลิเคชันทั้งหมดหลังจากประมวลผลข้อความแล้ว นี่คือรหัสที่จะใช้ถ้าคุณเรียกว่า Application.Run (แอปพลิเคชัน WinForms) วิธีนี้จะหยุดการวนลูปข้อความทั้งหมดที่ทำงานอยู่บนเธรดทั้งหมดและปิดหน้าต่างทั้งหมดของแอปพลิเคชัน

Environment.Exit

ยุติกระบวนการนี้และให้โค้ดการออกที่ระบุแก่ระบบปฏิบัติการ นี่คือรหัสการโทรเมื่อคุณใช้แอปพลิเคชันคอนโซล

บทความนี้Application.Exit vs. Environment.Exitชี้ไปที่คำแนะนำที่ดี:

คุณสามารถตรวจสอบว่าSystem.Windows.Forms.Application.RunมีการเรียกโดยการตรวจสอบSystem.Windows.Forms.Application.MessageLoopคุณสมบัติ หากเป็นจริงการเรียกใช้จะถูกเรียกใช้และคุณสามารถสันนิษฐานได้ว่าแอปพลิเคชัน WinForms กำลังดำเนินการดังต่อไปนี้

if (System.Windows.Forms.Application.MessageLoop) 
{
    // WinForms app
    System.Windows.Forms.Application.Exit();
}
else
{
    // Console app
    System.Environment.Exit(1);
}

การอ้างอิง: เหตุใดแอปพลิเคชันจะออกไม่ทำงาน


สิ่งนี้มีประโยชน์จริง ๆ สำหรับฉันเนื่องจากฉันมีแอพ WinForms ซึ่งมีข้อโต้แย้งดังนั้นมันจึงสามารถทำงานได้อย่างเงียบ ๆ และดังนั้นจึงไม่แสดงแบบฟอร์ม เมื่อแบบฟอร์มถูกซ่อนอยู่นั้นApplication.Exit()ไม่สามารถออกจากแอปได้ แต่Environment.Exit(1)ทำงานได้เหมือนเครื่องราง
Dib

5
คำถามไม่ได้กล่าวถึงการออกเนื่องจากข้อผิดพลาดดังนั้นรหัสออกควรเป็นศูนย์: ค่าที่ไม่เป็นศูนย์Environment.Exit(0) ใด ๆ หมายถึงรหัสข้อผิดพลาดเฉพาะแอปพลิเคชันที่สคริปต์สามารถใช้เพื่อดำเนินการที่เหมาะสม (นี่คือรหัสใหม่และแอปพลิเคชั่น WinForms ดังนั้นจึงไม่น่าจะมีความสำคัญในกรณีนี้ แต่เป็นสิ่งที่ดีสำหรับผู้ที่เขียนเครื่องมือบรรทัดคำสั่ง)
YipYip

Environment.Exitสามารถใช้สำหรับแอปพลิเคชันแบบฟอร์มได้เช่นกัน
Badiparmagi

1
แก้ไขฉันถ้าฉันผิด แต่ฉันคิดว่าreturnข้อความหลังจากนั้นจะปรับปรุงวิธีการนี้ให้มาก ตามที่ฉันเข้าใจรหัสจะดำเนินการต่อไปApplication.Exit()จนกว่าจะมีreturnข้อความ
Bighted19

17

ฉันรู้ว่านี่ไม่ใช่ปัญหาที่คุณมี แต่อีกสาเหตุที่อาจเกิดขึ้นคือคุณมีเธรดที่ไม่ใช่พื้นหลังเปิดอยู่ในแอปพลิเคชันของคุณ

using System;
using System.Threading;
using System.Windows.Forms;

namespace Sandbox_Form
{
    static class Program
    {
        private static Thread thread;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            thread = new Thread(BusyWorkThread);
            thread.IsBackground = false;
            thread.Start();

            Application.Run(new Form());

        }

        public static void BusyWorkThread()
        {
            while (true)
            {
                Thread.Sleep(1000);
            }
        }
    }
}

เมื่อIsBackgroundเป็นfalseมันจะทำให้โปรแกรมของคุณเปิดจนถึงเสร็จสมบูรณ์ด้ายถ้าคุณตั้งค่าIsBackgroundเพื่อtrueด้ายจะไม่ให้เปิดโปรแกรม สิ่งที่ชอบBackgroundWoker, ThreadPoolและTaskทั้งหมดภายในใช้ด้ายกับชุดIsBackgroundtrue


14

สิ่งที่คุณต้องการคือ System.Environment.Exit(1);

และจะใช้เนมสเปซของระบบ "ใช้ระบบ" ซึ่งมักจะมีอยู่เสมอเมื่อคุณเริ่มโครงการ


2
มันเหมาะสำหรับการใช้งานคอนโซลเท่านั้น
Nidhin David

สิ่งหนึ่งที่ควรทราบคือเหตุการณ์ FormClosing / FormClosed จะไม่ถูกเรียกใช้สำหรับ Environment นอกจากนี้ exitCode ควรเป็นค่าที่ไม่ใช่ศูนย์เท่านั้นหากเกิดข้อผิดพลาด
Raphael Smit

10

ฉันต้องการอย่างใดอย่างหนึ่งต่อไปนี้:

Application.Exit ();

สำหรับ winform หรือ

Environment.Exit (0);

สำหรับแอปพลิเคชันคอนโซล (ทำงานบน winforms ด้วย)

ขอบคุณ!


Environment.Exit (0) ใช้งานได้กับ WinForms ด้วยเช่นกันมีแอปพลิเคชันอยู่โดยไม่มีข้อยกเว้น
MulleOne

8

ยังไงซะ. ทุกครั้งที่แบบฟอร์มของฉันเรียกใช้เหตุการณ์ formclosed หรือ form form ฉันปิด applciation ด้วยฟังก์ชัน this.Hide () สิ่งนี้มีผลกระทบต่อการทำงานของแอปพลิเคชันของฉันหรือไม่

ในระยะสั้นใช่ โปรแกรมทั้งหมดจะสิ้นสุดเมื่อรูปแบบหลัก (รูปแบบการเริ่มต้นโดยApplication.RunในMainวิธีการ) ปิด (ไม่ได้ซ่อนไว้)

หากแอปพลิเคชันทั้งหมดของคุณควรยุติอย่างสมบูรณ์ทุกครั้งที่ปิดฟอร์มหลักของคุณคุณควรลบตัวจัดการปิดฟอร์มนั้นออก โดยไม่ยกเลิกกิจกรรมนั้นและเพียงแค่ให้พวกเขาปิดเมื่อผู้ใช้ปิดมันคุณจะได้รับพฤติกรรมที่คุณต้องการ สำหรับรูปแบบอื่น ๆ ทั้งหมดหากคุณไม่ต้องการแสดงตัวอย่างแบบฟอร์มเดียวกันอีกครั้งคุณเพียงแค่ปล่อยให้มันปิดแทนที่จะป้องกันการปิดและซ่อนไว้ หากคุณกำลังแสดงให้พวกเขาอีกครั้งแล้วซ่อนพวกเขาอาจจะดี

หากคุณต้องการให้ผู้ใช้คลิก "x" สำหรับแบบฟอร์มหลักของคุณ แต่มีแบบฟอร์มอื่นเปิดอยู่และในทางกลับกันกลายเป็นรูปแบบหลัก "ใหม่" แล้วมันซับซ้อนกว่าเล็กน้อย ในกรณีเช่นนี้คุณจะต้องซ่อนฟอร์มหลักของคุณแทนการปิด แต่คุณจะต้องเพิ่มกลไกบางประเภทที่จะปิดแบบฟอร์มหลักจริง ๆเมื่อคุณต้องการให้แอปของคุณสิ้นสุด หากนี่เป็นสถานการณ์ที่คุณต้องทำคุณจะต้องเพิ่มรายละเอียดเพิ่มเติมในคำถามของคุณเพื่ออธิบายประเภทของแอปพลิเคชันที่ควรและไม่ควรจบโปรแกรม


3

คุณทำ:

Application.Run(myForm);

ใน Main () ของคุณหรือไม่

ฉันพบว่าเป็นวิธีที่ง่ายมากในการฆ่าแอปพลิเคชันเมื่อปิดแบบฟอร์ม


1
ใช่มันมี Application.Run ในไฟล์ Program.cs ใน Main ฉันจะทำอย่างไรเพื่อปิดมัน?
John Ernest Guadalupe

แต่คุณจะผ่านแบบฟอร์มหลักของคุณเพื่อเรียกใช้ใช่ไหม แบบฟอร์มที่คุณปิดโดยคลิกที่เครื่องหมายกากบาทสีแดง
LightStriker

ใช่ฉันมีมันด้วย มันเป็นเช่นนั้น: Application.Run (new Form2 ());
John Ernest Guadalupe

ในกรณีนั้นถ้าฟอร์มหลักที่ส่งไปยัง Run ถูกปิดอย่างสมบูรณ์จริง ๆ แอปพลิเคชันจะออกโดยอัตโนมัติ จากนั้นคุณต้องติดตามสาเหตุที่ฟอร์มนั้นยังเปิดอยู่ทำงานอยู่หรือซ่อนอยู่ที่ไหนสักแห่ง
LightStriker


-4

ในกรณีนี้วิธีที่เหมาะสมที่สุดในการออกจากแอปพลิเคชันเพื่อแทนที่เมธอด onExit () ใน App.xaml.cs:

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}

ที่ช่วยให้คุณสามารถเรียกใช้รหัสเมื่อใดก็ตามที่มีเหตุการณ์การออกเกิดขึ้น แต่ไม่ได้ทำให้เกิดเหตุการณ์การออกจริง
jpaugh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.