C# 如何延迟一件事情而不是所有其他事情?

C# 如何延迟一件事情而不是所有其他事情?,c#,delay,C#,Delay,我想知道是否有人知道如何延迟c#延迟正在发生的一件事,而不是所有其他事情?我所做的是,它放置块,我有它的延迟,但球员(也放置块移动)也得到延迟。我目前正在使用: Thread.Sleep(200); 但是有没有其他方法可以在不延迟所有其他事件的情况下为一个事件创建延迟?没有更多信息,很难说。我的猜测是,您的所有UI呈现都是在单个线程上完成的,因此当您调用thread.Sleep()时,实际上是在暂停整个应用程序。您可以使用计时器来处理它-如果您使用windows窗体,请使用,并将延迟的代码放入

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

Thread.Sleep(200);

但是有没有其他方法可以在不延迟所有其他事件的情况下为一个事件创建延迟?

没有更多信息,很难说。我的猜测是,您的所有UI呈现都是在单个线程上完成的,因此当您调用thread.Sleep()时,实际上是在暂停整个应用程序。

您可以使用计时器来处理它-如果您使用windows窗体,请使用,并将延迟的代码放入Tick EventHandler中。启动计时器,然后退出您的方法。当勾号事件发生时,将调用Eventhandler。有了它,您可以使用任何类型的多线程,因为windows使用UI线程调用Tick Eventhandler

//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   

}

这个问题的答案在于理解线程是如何工作的。线程是程序执行的“一行”。因为我们的计算机运行许多程序(但只有一个CPU),所以操作系统必须能够停止一条“线路”并允许另一条“线路”运行。这些“线”称为线程

当一个线程被“暂停”时,表示它被“阻塞”。线程也可以阻塞自己(允许其他线程运行)。这实际上就是
Thread.Sleep
所做的,它会阻止正在执行的线程,并且在指定的时间间隔过去之前不会再次运行

如果在主(UI)线程上执行此操作,则UI将不会更新,并且该线程上的任何其他代码都不会运行,直到解除阻止为止。在您的场景中,听起来您需要一个线程来让“计算机播放器”放置块,然后再睡一会儿。顺便说一句,对于同样的行为(旋转线程、等待间隔、调用、重复),计时器基本上只是一个很好的包装器

换句话说,
Thread.Sleep
不仅仅是“延迟”一个动作,要有效地使用它,您需要确保理解代码的线程模型。听起来你总是在UI线程上,你可能需要自己启动一些

请注意,如果您不在UI线程上,则需要在
Invoke
方法中执行UI任务。这会将代码的执行推送到UI线程上


让我知道我是否能提供进一步的帮助

您也可以使用任务来延迟代码执行:

Task.Delay(200).ContinueWith((t) => World.Blocks[215, 273] = block)

线程任务您选择Window.Forms.Timer而不是Threading.Timer或Timers.Timer的任何特定原因?除非您已经在winforms应用程序中,否则这些将是更“正常”的计时器。此外,虽然这解决了问题,但它并没有解决OPs对线程的明显理解不足的问题。@LordTakkera:只是想让事情变得简单-因为Threading.Timer或Timers.Timer将使用另一个线程来做事情,因此意味着在多线程环境中工作。考虑到用例,他可能希望在任何情况下都处于一个线程中。。。不过我理解你的逻辑。还感谢您澄清此解决方案适用于windows窗体项目+1.