C# Windows窗体应用程序中的永久循环

C# Windows窗体应用程序中的永久循环,c#,loops,structure,C#,Loops,Structure,我使用的是Visual C,我使用的是Windows窗体,而不是控制台应用程序。因此,我不是在Main()中工作,而是在表单文件中工作。我对C#也很陌生,如果我的一些问题很愚蠢,那么很抱歉 我基本上需要做的是,当我的程序启动时,我需要它永远保持循环。既然我没有Main(),我将把这段代码放在哪里?我是否将它放在包含InitializeComponent()的函数中?我需要循环在程序启动后立即启动。但是,我需要在循环之前先声明一些变量。所以基本上我需要声明变量,然后开始无限循环。这些变量是全局的

我使用的是Visual C,我使用的是Windows窗体,而不是控制台应用程序。因此,我不是在Main()中工作,而是在表单文件中工作。我对C#也很陌生,如果我的一些问题很愚蠢,那么很抱歉

我基本上需要做的是,当我的程序启动时,我需要它永远保持循环。既然我没有Main(),我将把这段代码放在哪里?我是否将它放在包含InitializeComponent()的函数中?我需要循环在程序启动后立即启动。但是,我需要在循环之前先声明一些变量。所以基本上我需要声明变量,然后开始无限循环。这些变量是全局的

其次,当用户按下按钮时,我需要无限循环中断。我该怎么做?我在想一句话:

while (buttonIsPressed == false)
{
   //do whatever I need to do
}
然而,我意识到按钮的功能将永远不会被调用,因为我被困在那个循环中。如果由于处于无限循环中而无法达到按钮的功能,则无法从按钮的功能设置变量。有什么想法吗?我在考虑线程,但我绝对没有线程的经验,所以我有点不愿意尝试它


补充意见: 聊天应用程序。当程序启动时,我需要它保持 听。但是,当用户单击“连接”时,它将停止侦听 而是启动一个连接


我正在创建一个聊天客户端。所以基本上当我的程序启动时,我 需要它来保持倾听。但是,当用户单击“连接”时 需要停止侦听,而是启动连接


为什么你需要它永远保持循环

这里要指出的有趣的事情是,您的程序无论如何都会这样做;它被称为消息循环。当用户与它交互时(点击按钮等),它不断地接收消息

你到底想做什么?当然,已经有一个结构可以满足您的需求,无论是a,等等


要在TCP套接字上侦听,有一个类。您可以启动一个线程,让TCP侦听器在其中运行。

如果您需要表单响应按钮单击,则循环必须在主线程以外的线程中进行,a将适合您。

对于来自(完全)不同背景的人来说,这是一个自然的问题

Windows窗体应用程序的编程是事件驱动的。当Windows窗体应用程序启动时,将加载一个窗体(检查Program.cs文件),并且有一个主循环对您隐藏,以集中于程序中的重要内容

您不需要在主循环中放入任何内容来响应事件(如单击按钮的事件)。您只需通过为按钮的单击事件创建事件处理程序来处理按钮单击事件)。您可以使用设计器,也可以在代码中手动执行此操作

当您创建一个处理事件的方法(因此该方法被称为事件处理程序)时,在引发/触发事件时会自动调用该方法。例如,当用户单击按钮时,将调用窗体上按钮的单击事件的方法处理程序

此MSDN主题包含您需要的所有信息:。如果您需要更多说明,请询问!:)

更新:像上面一样创建一个事件处理程序,并以加载的事件处理程序的形式创建一个循环。确保调用Application.DoEvents()在循环内部。这样就可以处理按钮单击的事件处理程序(在处理程序中,添加代码以修改布尔值,从而使循环的条件为false以取消循环)

更新2: 为了使这个答案更完整,我提到你也应该考虑在一个新线程上运行循环,而不是UI一个(因此避免使用doStices,它与我的同龄人指出的一样有负面)。以下示例显示如何创建线程并单击按钮取消它:

    System.Threading.Thread t;
    private void Form1_Load(object sender, EventArgs e)
    {
        //create and start a new thread in the load event.
        //passing it a method to be run on the new thread.
        t = new System.Threading.Thread(DoThisAllTheTime);
        t.Start();
    }

    public void DoThisAllTheTime()
    {
        while (true)
        {
            //you need to use Invoke because the new thread can't access the UI elements directly
            MethodInvoker mi = delegate() { this.Text = DateTime.Now.ToString(); };
            this.Invoke(mi);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //stop the thread.
        t.Suspend();
    } 

最后,考虑使用一个封装创建和管理线程的方法。

< P>看来,您正在尝试创建一个聊天客户端(参见一些示例代码)。对于长时间运行的并行执行,我建议您创建并启动一个while循环,其主体就是您提到的while循环

您必须了解的关键是,将有两个执行线程。一个是UI线程,负责绘制表单并对按钮单击等事件做出反应(注意:这将在用户与UI交互时对事件做出永久性的循环反应)。另一个线程是循环后台线程,您将创建该线程以侦听网络信息。上面引用的示例聊天客户端创建线程以响应单击的特定按钮,但由于您希望尽快开始循环,我建议您创建并启动线程以响应(只需在Visual Studio中以设计器模式双击表单以创建适当的加载事件处理程序)

棘手的部分是当您想从后台线程更新UI元素时。要做到这一点,您必须将方法调用封送到UI线程。这可以通过在任何控件上使用来完成(再次参见引用的示例代码)


要跳出循环,可以在单击按钮的事件处理程序中将buttonPressed标志设置为false。此eventhandler将在UI线程上运行,但共享标志将允许后台线程在下次迭代到condition语句时中断其循环

请仔细阅读一下Windows窗体的工作原理。你已经在永远循环了。我知道,但我特别需要循环某个函数。所以当程序启动时,我需要一个特定的部分永远循环。你的循环需要做什么?你必须寻找另一种选择。定时器或线程是比较明显的选择,不是吗