如何延迟一件事而不是其他一切?

时间:2014-04-05 21:23:01

标签: c# delay

我想知道是否有人知道如何延迟c#延迟发生的事情而不是其他所有事情?我正在做的是它放置了块,并且我有延迟,但玩家(也放置块移动)也得到了延迟。我目前正在使用:

Thread.Sleep(200);

但是还有另一个为一个事件创建延迟而不延迟所有其他事件吗?

4 个答案:

答案 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.