c# while循环防止表单加载

本文关键字:表单 加载 while 循环 | 更新日期: 2023-09-27 18:12:06

我在c#的WindowsForms应用程序中创建了一个"Main()"函数。我一直在看一本关于c#游戏编程的书。当我运行示例时,一切都正常,但当我试图创建自己的版本时,一切都不起作用。

下面是Main()函数:
    public void Main()
    {
        while (!gameOver)
        {
            // Non timed code:           
            int ticks = Environment.TickCount;
            if (ticks > lastTick + 16)
            {
                lastTick = ticks;
                //Timed (60FPS) code here:
                Application.DoEvents();  
            }
        }
    }

当我把它放在"Form1_Load"函数内时,窗体甚至不显示何时启动程序,同时不给出任何错误或警告(在示例中执行相同的操作)。如果我移动我的"Main()",例如"MouseClick"和表单显示,当我点击是函数开始运行,因为它应该。

我真的不知道为什么会发生这种事。我是不是错过了什么很明显的东西?

c# while循环防止表单加载

窗体的Load事件并不是开始游戏循环的最佳地点。Load将被触发有两个基本原因。"好的"方式是当它在Show()调用的响应中发生时,通常出现在Program.Main()方法中。你的游戏循环会起作用的。

"坏"的方式是当代码在你的表单构造函数要求表单的Handle属性是有效的。这将迫使Winforms创建本机窗口并触发Load。通常有一个好的结局,它变得越复杂的几率越低。

由于Load事件处理程序没有返回,因此将在您的情况下出错。这意味着构造函数不能完成。这意味着窗户不可见。这意味着"游戏结束"永远不会成为现实。游戏结束。使用调试器诊断此问题,在Load事件处理程序上设置断点,并查看Call Stack窗口。期望在构造函数中看到导致问题的语句。

最后但并非最不重要的是,要非常警惕这种故障模式。

真正的解决方法是将这段代码放在正确的位置。它在Program.Main()方法中。约:

    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        // Application.Run(new Form1());   Not this anymore
        var window = new Form1();
        window.Show();
        // Your game loop here
        //...
    }

您可以尝试将循环逻辑放在静态void方法中并在线程中执行

这样它就会正常运行然后表单就会继续加载