2011-04-05 125 views
1

好的,我在C#中有问题。在我的脚本Threading.Sleep()引起的滞后性,我想我做错了什么,这是源的一部分:C#Thread.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

是的,你做错了什么:Thread.Sleep。你在开玩笑吗? – 2011-04-05 10:49:27

+0

嗯...,我不是很擅长这个,但Thread.Sleep在为我工作之前 – giger 2011-04-05 10:50:42

+1

你试图解决什么问题? – 2011-04-05 10:50:47

回答

1

你是什么意思得到滞后?我猜这就是你如何描述你的代码正在睡觉的时间。

也许你可能想看看一个Timer类[0],然后你可以将后面的代码绑定为一个事件。

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


编辑回应评论:

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

我的方法会涉及一个计时器。当你想让程序停下来时,你可以创建一个计时器,并在暂停结束时触发一个事件。然后,该事件调用您想要在该时间结束时运行的方法。这可能需要对代码进行一些重构。

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

有一点可以肯定的是,如果你对一个应用程序中的多个线程的工作方式不太熟悉或不熟悉,那么你可能需要先进行一些常规阅读。

+0

我希望该程序在一段时间内什么也不做,之后应该继续工作 – giger 2011-04-05 11:57:43

+0

@giger:我已经详细讨论了两种方法。 – Chris 2011-04-05 12:54:03

2

你是什么意思?在这种情况下,没有太多的上下文,它看起来像阻止主线程,它会锁定你的应用程序的持续时间为Sleep()。你还说你想睡300毫秒,但你有1000个传递给函数。使用类似BackgroundWorker的东西来将文本发送到后台线程的逻辑,以便在发生时不会阻止UI。