C#Thread.Sleep()导致滞后

时间:2011-04-05 10:47:28

标签: c#

好的,我在C#中遇到问题。在我的脚本Threading.Sleep()导致滞后,我认为我做错了,这是源代码的一部分:

case 2:
{
   mouse_event(MOUSEEVENTF_LEFTDOWN, Pos.X, Pos.Y, 0, 0);
   mouse_event(MOUSEEVENTF_LEFTUP, Pos.X, Pos.Y, 0, 0);

   SendKeys.Send(textBox1.Text);
   Thread.Sleep(300);
   SendKeys.Send("{ENTER}");

   break;
}

我想发送文本,等待300毫秒并发送回车,但我只是收到滞后的时间,一切都没有等待。 也许有其他替代品?

2 个答案:

答案 0 :(得分:2)

滞后是什么意思?在没有太多上下文的情况下,看起来你正在阻塞主线程,然后它会在Sleep()的持续时间内锁定你的应用程序。你还说你要睡300毫秒,但你已经传递了1000个函数。使用类似BackgroundWorker之类的东西来放置在后台线程中发送文本的逻辑,这样你就不会在UI发生时阻止它。

答案 1 :(得分:1)

迟滞是什么意思?我猜这就是你如何描述代码花费睡眠的时间。

也许您可能希望查看Timer类[0],然后可以将后面的代码绑定为事件。

[0]这里描述了三个计时器类:http://msdn.microsoft.com/en-us/magazine/cc164015.aspx。我倾向于使用System.Timers.Timer类。


编辑以回复评论:

你需要通过“什么都不做”来思考你的意思。什么都不做包括不更新UI或任何东西。字面上什么都不做。我假设这是你所描述的滞后。为了解决这个问题,两个答案中描述了两种方法。两者最终都涉及使用线程,以便主线程可以继续允许UI功能在您的辅助线程可以工作时发生。

我的方法会涉及一个计时器。当您希望程序停止一点时,您可以创建一个计时器,其中包含一个在暂停结束时将触发的事件。然后该事件调用您想要在该时间结束时运行的方法。这可能需要对您的代码进行一些重构。

另一种方法涉及产生一个单独的,你的其他代码可以运行。因为这是一个二级线程睡觉这不会影响你的应用程序的其余部分的响应,只有那个线程,所以它应该无关紧要。这可能是最简单的做事方式。

有一件事是肯定的,如果你不是很熟悉或者熟悉一个应用程序中的多个线程如何工作,那么你可能想先做一些一般的阅读。