解决 如何从另一个类的函数退出程序?

WB1975

知名会员
已加入
2020年4月3日
留言内容
87
编程经验
Beginner
当用户输入q时,如何在主程序中退出循环?

最好的设置方法是什么?

我有这堂课

C#:
using System;

namespace HourlyMeetingScheduler
{
    class Program
    {
        static void Main(string[] args)
        {
            bool programRunning = true;

            while (programRunning) {
                Utility myUtility = new Utility();
                myUtility.WelcomeUser();
                myUtility.PrintMainMenu();
                myUtility.MainMenuLogic();
            }
        }
    }   
}

和这个

C#:
using System;
using System.Collections.Generic;
using System.Text;

namespace HourlyMeetingScheduler
{
    class Utility
    {
        public void WelcomeUser()
        {
            Console.WriteLine("\nWelcome to the hourly scheduler");
            Console.WriteLine("*******************************");
        }

        public void PrintMainMenu()
        {
            Console.WriteLine("\nMain Menu");
            Console.WriteLine("*********");
            Console.WriteLine("\n(a) Add appointment/s");
            Console.WriteLine("(r) Remove appointment/s");
            Console.WriteLine("(e) Edit appointment/s");
            Console.WriteLine("(v) View appointment/s");
            Console.WriteLine("(q) quit");
        }

        public void MainMenuLogic()
        {
            string userChoice = Console.ReadLine();
            char firstLetter = userChoice[0];
            switch (firstLetter)
            {
                case 'a':
                    AddAppointment();
                    break;

                case 'r':
                    RemoveAppointment();
                    break;

                case 'e':
                    EditAppointment();
                    break;

                case 'v':
                    ViewAppointments();
                    break;

                case 'q':
                    //quit loop
                    break;
            }
        }
    }
}
 

WB1975

知名会员
已加入
2020年4月3日
留言内容
87
编程经验
Beginner
我只是不明白你能不能详细说明一下约翰
MainMenuLogic是一个不返回任何内容的void方法
如何使布尔等于方法?
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,969
地点
英国
编程经验
10+
bool programRunning = true;
在课堂上宣告。例如,如果您在另一个线程中,并且基于上述布尔值为true运行循环,则可以从另一个线程将其设置为false。这将停止当前循环的运行。
//quit loop
将您的布​​尔值设置为false。

理想情况下,我希望在新线程上而不是在main方法上运行循环。请注意,由于定义了布尔值的范围,因此无法更改。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,580
地点
弗吉尼亚州切萨皮克
编程经验
10+
此外,使用 @约翰·H 's approach will let you rewrite you Main() to something which expresses your intent better:
C#:
Utility myUtility = new Utility();

do
{
    myUtility.WelcomeUser();
    myUtility.PrintMainMenu();
} while(myUtility.MainMenuLogic());
 

品露

成员
已加入
2020年3月22日
留言内容
5
编程经验
Beginner
您好,我对编码非常陌生,但是我的程序却非常相似。

我注意到您在交换网段中使用中断。
我这样做:(以我的代码为例)
Main:
private static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                bool Alive = true;
                while (Alive)
                {
                    Alive = MainCode();
                }
            }
            else
            {
                bool Alive = true;
                while (Alive)
                {
                    Alive = PrefixMainCode(args);
                }
            }
        }


这是我的示例开关:


C#:
private static bool MainCode()
        {
            _ = new MenuDrawer("Main Menu", "Input: ", false);
            switch (Console.ReadLine())
            {
                case "rdp":
                    Openrdp();
                    return true;

                case "mkdir":
                    _ = new FolderCreater();
                    return false;

                case "mail":
                    _ = new MailSender();
                    return false;

                case "exit":

                    return false;

                default:

                    return true;

所以如果我返回false =程序关闭,true =程序保持打开状态


我没见过"Brake"所以我不确定这篇文章是否有帮助。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,580
地点
弗吉尼亚州切萨皮克
编程经验
10+
P :通常,构造函数应用于初始化对象,而不是用于执行操作或大量工作。在第9个帖子中编写代码的方式使构造函数完成所有工作。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,969
地点
英国
编程经验
10+
C#:
        public static bool programRunning = true;
        static void Main(string[] args)
        {
            Thread RunApp = new Thread(() => RunOptions());
            RunApp.Start();
        }
        private static void RunOptions()
        {
            while (programRunning)
            {
                Utility myUtility = new Utility();
                myUtility.WelcomeUser();
                myUtility.PrintMainMenu();
                myUtility.MainMenuLogic();
            }
        }

        class Utility
        {
            public void WelcomeUser()
            {
                Console.WriteLine("\nWelcome to the hourly scheduler");
                Console.WriteLine("*******************************");
            }

            public void PrintMainMenu()
            {
                Console.WriteLine("\nMain Menu");
                Console.WriteLine("*********");
                Console.WriteLine("\n(a) Add appointment/s");
                Console.WriteLine("(r) Remove appointment/s");
                Console.WriteLine("(e) Edit appointment/s");
                Console.WriteLine("(v) View appointment/s");
                Console.WriteLine("(q) quit");
            }

            public void MainMenuLogic()
            {
                string userChoice = Console.ReadLine();
                char firstLetter = userChoice[0];
                switch (firstLetter)
                {
                    case 'a':
                        AddAppointment();
                        break;

                    case 'r':
                        RemoveAppointment();
                        break;

                    case 'e':
                        EditAppointment();
                        break;

                    case 'v':
                        ViewAppointments();
                        break;

                    case 'q':
                        //quit loop
                        programRunning = false;
                        break;
                }
            }
        }
C#:
        static void Main(string[] args)
        {
            Thread RunApp = new Thread(() => RunOptions());
            RunApp.Start();
        }
        private static void RunOptions()
        {
            Utility myUtility = new Utility();
            do
            {
                /* Does these until it reaches the while */
                myUtility.WelcomeUser();
                myUtility.PrintMainMenu();
            }
            while (myUtility.MainMenuLogic()); /* While running, if myUtility.MainMenuLogic() returns false, it exits */
        }

        class Utility
        {
            public void WelcomeUser()
            {
                Console.WriteLine("\nWelcome to the hourly scheduler");
                Console.WriteLine("*******************************");
            }

            public void PrintMainMenu()
            {
                Console.WriteLine("\nMain Menu");
                Console.WriteLine("*********");
                Console.WriteLine("\n(a) Add appointment/s");
                Console.WriteLine("(r) Remove appointment/s");
                Console.WriteLine("(e) Edit appointment/s");
                Console.WriteLine("(v) View appointment/s");
                Console.WriteLine("(q) quit");
            }

            public bool MainMenuLogic()
            {
                string userChoice = Console.ReadLine();
                char firstLetter = userChoice[0];
                switch (firstLetter)
                {
                    case 'a':
                        AddAppointment();
                        break;

                    case 'r':
                        RemoveAppointment();
                        break;

                    case 'e':
                        EditAppointment();
                        break;

                    case 'v':
                        ViewAppointments();
                        break;

                    case 'q':
                        //quit loop
                        return false;
                }
                return true;
            }
        }
您可能会问为什么是线程。无非就是偏爱。我在新线程上运行所有程序。如果您不想要它,请使用RunOptions()将其删除。
 

WB1975

知名会员
已加入
2020年4月3日
留言内容
87
编程经验
Beginner
羊皮

什么是"如果您在另一个线程中"只是如果您使用的是从另一个类实例化的对象?没看过"thread" before
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,969
地点
英国
编程经验
10+
阅读我签名中的线程链接。它解释了您需要了解的所有内容...然后还阅读了链接的页面。

只是回答您的问题,不。它不是。

如果您不想使用该线程,请替换为:
C#:
            Thread RunApp = new Thread(() => RunOptions());
            RunApp.Start();
和 : RunOptions();

总的来说,这是我遵循的原则。当我从UI调用任何代码时,例如按钮,甚至在控制台应用程序中。我在新线程上运行所有程序。并不是每个人都同意这样做,但是在我看来,当您在表单等上处理UI时,这是一个养成的好习惯。在非用户界面线程上运行繁重的流程的地方。基本上,当您在UI线程上运行及时执行时,它会锁定它,并在长时间执行完成时使UI无响应。长时间运行耗时的操作始终最好在新线程上运行,因为这样可以避免锁定UI。因此,对我来说,引入线程实际上是本能,并且不会造成任何危害。在大多数情况下,您在这里不需要它。但它的习惯值得发展。
 

WB1975

知名会员
已加入
2020年4月3日
留言内容
87
编程经验
Beginner
阅读我签名中的线程链接。它解释了您需要了解的所有内容...然后还阅读了链接的页面。

只是回答您的问题,不。它不是。

如果您不想使用该线程,请替换为:
C#:
            Thread RunApp = new Thread(() => RunOptions());
            RunApp.Start();
和 : RunOptions();

总的来说,这是我遵循的原则。当我从UI调用任何代码时,例如按钮,甚至在控制台应用程序中。我在新线程上运行所有程序。并不是每个人都同意这样做,但是在我看来,当您在表单等上处理UI时,这是一个养成的好习惯。在非用户界面线程上运行繁重的流程的地方。基本上,当您在UI线程上运行及时执行时,它会锁定它,并在长时间执行完成时使UI无响应。长时间运行耗时的操作始终最好在新线程上运行,因为这样可以避免锁定UI。因此,对我来说,引入线程实际上是本能,并且不会造成任何危害。在大多数情况下,您在这里不需要它。但它的习惯值得发展。

您是否使用WPF为程序创建前端?我还应该打扰吗?
 
最佳 底部