Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# 线程。显示每个步骤的睡眠或计时器_C#_Winforms_Timer_Thread Sleep - Fatal编程技术网

C# 线程。显示每个步骤的睡眠或计时器

C# 线程。显示每个步骤的睡眠或计时器,c#,winforms,timer,thread-sleep,C#,Winforms,Timer,Thread Sleep,我正在用winforms做一个游戏,其中一个代理(计算机)可以向4个方向移动。我使用按钮控制的基础和显示和隐藏的图像在任何时候都需要。我使用了Thread.Sleep,但问题是当我点击按钮时,表单上并没有显示任何内容。后台的流程运行良好,但没有显示每个步骤。是的,我正在当前UI线程中使用线程。 我想以2秒的间隔向用户展示每一步。没有任何代码就很难回答,但据我所知,主要问题是你改变了世界的外观,然后让它睡觉,这意味着什么都不会被画出来。然后当线程醒来时,你再次改变世界,让它进入睡眠。没有什么东西会

我正在用winforms做一个游戏,其中一个代理(计算机)可以向4个方向移动。我使用按钮控制的基础和显示和隐藏的图像在任何时候都需要。我使用了Thread.Sleep,但问题是当我点击按钮时,表单上并没有显示任何内容。后台的流程运行良好,但没有显示每个步骤。是的,我正在当前
UI
线程中使用
线程。


我想以2秒的间隔向用户展示每一步。

没有任何代码就很难回答,但据我所知,主要问题是你改变了世界的外观,然后让它睡觉,这意味着什么都不会被画出来。然后当线程醒来时,你再次改变世界,让它进入睡眠。没有什么东西会被画成那样

更好的方法是使用定时器,将其设置为一个定时器和一个需要显示的事件队列,这样您就可以完成任务了

您是否在使用winForms,因为如果您在使用WPF,您可以做更多更好的事情


编辑:我并不是说计时器是最好的方式,但它是一种很好的有效方式

使用线程。睡眠是一种糟糕的设计选择,原因有几个:

  • 它在线程睡眠期间阻塞线程
  • 它会耗尽线程池中的线程,因此此解决方案根本无法很好地扩展
  • 这是一种糟糕的计时机制,因为这里有一个时间片,或者说量子,在不同的操作系统甚至同一操作系统的版本(读:Windows)之间变化
  • 前一个SO问题提供了有关Thread.Sleep不好的原因的更多信息:


    您正在使用
    线程。是否在当前UI线程上睡眠