我想知道是否有人知道如何延迟c#延迟发生的事情而不是其他所有事情?我正在做的是它放置了块,并且我有延迟,但玩家(也放置块移动)也得到了延迟。我目前正在使用:
Thread.Sleep(200);
但是还有另一个为一个事件创建延迟而不延迟所有其他事件吗?
答案 0 :(得分:2)
您可以使用计时器来处理它 - 如果您使用Windows窗体,请使用System.Windows.Forms.Timer并将延迟代码放入Tick EventHandler。启动计时器,然后退出方法。 Tick事件发生时将调用Eventhandler。有了这个,您可以使用任何类型的多线程,因为Windows使用UI线程来调用Tick事件处理程序。
//Put this on modular level so you can access it later on
private System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
/* Adds the event and the event handler for the method that will
process the timer event to the timer. Put this into your method instead of Thread.Sleep(200)*/
myTimer.Tick += new EventHandler(myTimer_Tick);
// Sets the timer interval to 200 milliseconds.
myTimer.Interval = 200;
myTimer.Start();
//Here's your event handler - stop the timer so it doesn't reexecute
private void myTimer_Tick(Object myObject, EventArgs myEventArgs)
{
myTimer.Stop();
//Execute delayed action here
}
答案 1 :(得分:0)
没有更多信息,很难说。我的猜测是你所有的UI渲染都是在一个线程上完成的,所以当你调用Thread.Sleep()时,你就会有效地暂停整个应用程序。
答案 2 :(得分:0)
这个问题的答案在于理解线程的工作方式。线程是"线"程序执行。因为我们的计算机运行许多程序(但只有一个CPU),所以操作系统必须能够停止一个" line"并允许其他人运行。这些"线"被称为线程。
当一个帖子被暂停时#34;据说它被封锁了#34;线程也可以阻塞自己(允许其他线程运行)。这实际上是Thread.Sleep
所做的,它会阻塞执行线程,并且在指定的时间间隔过去之前不会再次运行。
如果您在主(UI)线程上执行此操作,那么您的UI将不会更新,并且该线程上的其他代码在解除阻塞之前不会运行。根据您的方案,听起来您需要一个用于您的计算机播放器的线程"放置块然后再睡一会儿。顺便说一下,计时器基本上只是这个相同行为的一个很好的包装器(旋转一个线程,等待间隔,调用,重复)。
换句话说,Thread.Sleep
所做的远远超过"延迟"一个动作,为了有效地使用它,你需要确保你理解你的代码的线程模型。听起来你总是在UI线程上,你可能需要自己创建一些。
请注意,如果您不在UI线程上,则需要使用Invoke
方法执行UI任务。这会将该代码的执行推送到UI线程上。
如果我能得到进一步的帮助,请告诉我!
答案 3 :(得分:0)
您也可以使用任务来延迟代码执行:
Task.Delay(200).ContinueWith((t) => World.Blocks[215, 273] = block)
Reading further on SO reveals that a Task.Delay uses a Timer underneath.