Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#无锁定UI的多个短延迟_C#_Multithreading_Winforms - Fatal编程技术网

C#无锁定UI的多个短延迟

C#无锁定UI的多个短延迟,c#,multithreading,winforms,C#,Multithreading,Winforms,我正在尝试编写一个简单的Snake应用程序,使用空白面板和表布局窗格来形成网格。我决定“形成”我的蛇的方式是在我的网格上创建一个移动的“头”,将面板背景更改为黑色。任何时候面板从黑色变为白色,都会增加一个小的延迟(十分之一秒)。蛇的生长或收缩取决于延迟的大小 Task.Factory.StartNew(() => Thread.Sleep(100 * (snake.getLength() - 1))) .ContinueWith(t =>

我正在尝试编写一个简单的Snake应用程序,使用空白面板和表布局窗格来形成网格。我决定“形成”我的蛇的方式是在我的网格上创建一个移动的“头”,将面板背景更改为黑色。任何时候面板从黑色变为白色,都会增加一个小的延迟(十分之一秒)。蛇的生长或收缩取决于延迟的大小

Task.Factory.StartNew(() => Thread.Sleep(100 * (snake.getLength() - 1)))
                .ContinueWith(t =>
                    {
                        tableLayoutPanel1.GetControlFromPosition(oldColumn, oldRow).BackColor = Color.White;
                    });
这对于较小的蛇来说效果很好,但对于较大尺寸的蛇,我注意到性能下降,而且背景颜色有时不会重置。我假设这是由于创建/销毁了大量线程


有没有一种方法可以减少我正在使用的线程数量?还有什么其他方法可以添加这样的延迟?

游戏通常有更新和渲染线程。更新线程以固定的时间步运行(或者可以使用增量时间运行),执行游戏逻辑并改变游戏状态。渲染分别进行,并绘制游戏对象的位置等。我想你可能想将你的蛇“段”存储在一个有序的数组(
列表
)中,并将它们的位置更新到更新循环中的新位置。渲染可以检查哪些面板被占用并更改颜色。您不应该使用Thread.Sleep,使用Task.Delay。之后,您应该使用tablLayoutPanel.Invoke更改颜色,不要直接设置。切换到TaskEx.Delay似乎效果更好。但是我很好奇,使用invoke方法比直接设置颜色有什么好处?