计时器[延迟而不冻结应用程序!] C#

时间:2013-07-25 17:58:50

标签: c#

我正在尝试创建一个每10分钟执行10个不同SQL查询的应用程序, 在每个SQL查询之间应该有一个短暂的延迟(例如,1秒)。

如果我尝试使用Thread.Sleep(1000);,则其他计时器停止,整个应用程序冻结。

任何想法如何在不冻结应用程序或停止其他计时器的情况下执行此操作?

3 个答案:

答案 0 :(得分:5)

您可以使用线程来启动另一个执行这些操作的线程。

最简单的形式是System.Threading.ThreadPool.QueueUserWorkItem(WaitCallback)

需要一个代表消耗一个object的代理并执行任务。

e.g。

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);

答案 1 :(得分:1)

对于每个计时器的执行,您应该启动一个新线程来执行SQL查询代码。

答案 2 :(得分:0)

我认为你所说的每10分钟你需要发出10个SQL查询,并且你想要在每个查询之间暂停。

第一个问题,您希望在下一次开始之前完成并在它们之间添加1秒吗?或者每隔1秒开始一次,但是所有可能同时运行?

你是在主UI线程(坏主意)还是工作线程中运行这些?

根据您的问题,我认为您在主线程中运行它们。而是创建一个每10分钟触发一次的工作线程。如果没有工作线程,只要查询需要一段时间,系统就会冻结。

如果你想在一个线程完成和下一个线程开始之间需要1秒,你可以将Sleep(1000)调用放入工作线程中。

如果你想在每个开头之间1秒,你需要10个工作线程。第一个将第二个设置为1秒内触发,然后调用它的查询。第二个将设置第三个在1秒内触发,然后开始查询。