计时器[延迟而不冻结应用程序!]C#
我试图让一个应用程序每10分钟执行10个不同的SQL查询, 每个SQL查询之间应该有一个短的延迟(例如,1秒) 如果我尝试使用计时器[延迟而不冻结应用程序!]C#,c#,C#,我试图让一个应用程序每10分钟执行10个不同的SQL查询, 每个SQL查询之间应该有一个短的延迟(例如,1秒) 如果我尝试使用Thread.Sleep(1000),其他计时器停止,整个应用程序冻结 您知道如何在不冻结应用程序或停止其他计时器的情况下执行此操作吗?对于每个计时器的执行,您应该启动一个新线程来执行SQL查询代码。对于每个计时器的执行,您应该启动一个新线程来执行SQL查询代码。您可以使用线程来启动另一个执行这些操作的线程 最简单的形式是System.Threading.ThreadPo
Thread.Sleep(1000)代码>,其他计时器停止,整个应用程序冻结
您知道如何在不冻结应用程序或停止其他计时器的情况下执行此操作吗?对于每个计时器的执行,您应该启动一个新线程来执行SQL查询代码。对于每个计时器的执行,您应该启动一个新线程来执行SQL查询代码。您可以使用线程来启动另一个执行这些操作的线程
最简单的形式是System.Threading.ThreadPool.QueueUserWorkItem(WaitCallback)
它接受一个使用单个对象的委托
,并执行任务
e、 g
您可以使用线程来启动另一个执行这些操作的线程
最简单的形式是System.Threading.ThreadPool.QueueUserWorkItem(WaitCallback)
它接受一个使用单个对象的委托
,并执行任务
e、 g
我认为您所说的是,每10分钟您需要发出10个SQL查询,并且您希望在每个查询之间暂停
第一个问题,您是否希望在下一个开始之前完成一个,并在它们之间添加1秒?或者每隔1秒启动一次,但所有设备可能同时运行
您是在主UI线程(坏主意)还是工作线程中运行这些线程
基于你的问题,我认为你在你的主线中运行它们。而是创建一个每10分钟触发一次的工作线程。如果没有工作线程,系统将在查询需要一段时间时冻结
如果希望在一个线程完成和下一个线程开始之间间隔1秒,可以将Sleep(1000)调用放入工作线程
如果希望在每个线程开始之间间隔1秒,则需要10个工作线程。第一个将设置第二个在1秒内触发,然后调用它的查询。第二个将设置第三个在1秒内启动,然后启动它的查询。我想你说的是每10分钟需要启动10个SQL查询,并且需要在每个查询之间暂停
第一个问题,您是否希望在下一个开始之前完成一个,并在它们之间添加1秒?或者每隔1秒启动一次,但所有设备可能同时运行
您是在主UI线程(坏主意)还是工作线程中运行这些线程
基于你的问题,我认为你在你的主线中运行它们。而是创建一个每10分钟触发一次的工作线程。如果没有工作线程,系统将在查询需要一段时间时冻结
如果希望在一个线程完成和下一个线程开始之间间隔1秒,可以将Sleep(1000)调用放入工作线程
如果希望在每个线程开始之间间隔1秒,则需要10个工作线程。第一个将设置第二个在1秒内触发,然后调用它的查询。第二个会让第三个在1秒内开火,然后开始它的查询。一旦你了解到你正在使用的计时器在UI线程上运行它的代码,这就变成了具有相同解决方案的任何计时器的副本。你介意显示一些代码吗?一旦你了解到你正在使用的计时器在UI线程上运行它的代码,这就变成了一个简单的问题使用相同的解决方案复制任何一个。您介意显示一些代码吗?好的,首先谢谢。然后,我尝试将您的代码作为测试放入我的源代码中,您可以看到等待中有一个红色标记。有什么解决方法吗?该方法称为睡眠,而不是等待。我在答案中修复了它。这将冻结应用程序。如果您按照Guvante的建议通过线程池触发此方法,则不会。QueueUserWorkItem
。@ahmedtota2006:我扩展了答案以显示此方法的“调用”位置。首先谢谢。然后,我尝试将您的代码作为测试放入我的源代码中,您可以看到等待中有一个红色标记。有什么解决方法吗?该方法称为睡眠,而不是等待。我在答案中修复了它。这将冻结应用程序。如果您按照Guvante的建议通过线程池触发此方法,则不会。QueueUserWorkItem
。@ahmedtota2006:我扩展了答案以显示此方法被“调用”的位置。
private void Worker(object ignored)
{
//Run first query
Thread.Sleep(1000);
//Run second query etc.
}
//The following code is where you want to start the process
//For instance in response to a timer
ThreadPool.QueueUserWorkItem(Worker);