c#while循环可防止表单加载

时间:2014-07-09 15:50:10

标签: c# winforms while-loop main

我在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”并且表单显示,当我单击时,该函数开始按原样运行。

我真的没有想到为什么会这样。我错过了一些非常明显的东西吗?

2 个答案:

答案 0 :(得分:2)

表单的Load事件并不是启动游戏循环的最佳位置。 Load将被解雇有两个基本原因。 “好”的方式是它响应Show()调用而发生,通常出现在Program.Main()方法中。你的游戏循环会起作用。

“糟糕”的方式是表单构造函数中的代码要求表单的Handle属性有效。这迫使Winforms创建本机窗口并触发Load。仍然通常达到了良好的目的,可能性越低,它就越复杂。

因为Load事件处理程序没有返回,所以出错。这意味着构造函数无法完成。这意味着窗口无法显示。这意味着“gameOver”永远不会成为现实。游戏结束。您可以使用调试器对此进行诊断,在Load事件处理程序上设置断点并查看“调用堆栈”窗口。期望您将在构造函数中看到导致问题的语句。

最后但同样重要的是,要对this failure mode保持警惕。

真正的解决方法是将此代码放在正确的位置。这是在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
        //...
    }

答案 1 :(得分:0)

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

这样它将以快乐的方式进行,表格将继续并加载