【问题标题】:timers [Delay without Freezing the app !] C#timers [延迟而不冻结应用程序!] C#
【发布时间】:2013-07-26 05:21:07
【问题描述】:

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

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

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

【问题讨论】:

  • 一旦您了解您使用的计时器在 UI 线程上运行它的代码这一事实,这就会成为具有相同解决方案的任何 many "UI Freezes" questions 的副本。
  • 您介意展示您的一些代码吗?

标签: c#


【解决方案1】:

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

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

它接受一个使用单个object 的委托并执行任务。

例如

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

【讨论】:

  • 首先谢谢你。然后我尝试将您的代码作为测试prntscr.com/1hh8ry 放入我的源代码中,您可以看到等待下有一个红色标记。有什么办法吗?
  • 该方法称为睡眠,而不是等待。我在答案中修复了它。
  • 这将冻结应用程序。
  • 如果您按照 Guvante 的建议通过 ThreadPool.QueueUserWorkItem 触发此方法,则不会。
  • @ahmedtota2006:我扩展了答案以显示“调用”此方法的位置。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我认为您的意思是每 10 分钟您需要触发 10 个 SQL 查询,并且您希望在每个查询之间暂停。

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

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

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

    如果您希望一个线程完成和下一个线程开始之间有 1 秒,您可以将 Sleep(1000) 调用放在工作线程中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 2015-01-23
      相关资源
      最近更新 更多