【问题标题】:Efficiency of DispatcherTimer versus Thread.SleepDispatcherTimer 与 Thread.Sleep 的效率
【发布时间】:2014-09-22 09:20:49
【问题描述】:

在 C# 中使用DispatcherTimerThread.Sleep 哪个更有效?

我可以使用DispatcherTimer:

 DispatcherTimer timer = new DispatcherTimer();
 timer.Interval = TimeSpan.FromSeconds(20);
 timer.Tick += timer_Tick;
 timer.Start(); // do something every 20 seconds

或者,我可以使用Thread.Sleep

 while(true) {
    Thread.Sleep(20000);
    // do something every 20 seconds
 }

我们应该在哪些情况下使用它们?有什么最佳做法吗?

编辑:根据第一个答案,我需要补充一点,我正在开发的应用程序没有 UI(所以阻塞线程没有问题),因为它是一个后台跟踪器,只是将其数据写入日志文件。

【问题讨论】:

  • 在告诉线程在给定时间内什么都不做的上下文中,您对“效率”的定义是什么?
  • 你在用大炮压扁一只蚊子。从控制台应用程序项目模板开始。项目 + 属性,应用程序选项卡,输出类型 =“Windows 应用程序”以删除控制台。

标签: c# multithreading timer


【解决方案1】:

如果你需要在调度线程中操作,那么你真的不想使用Thread.Sleep - 你最终会阻塞调度线程,所以你的用户界面会被冻结.

可以让后台线程在操作之间休眠 20 秒,并使用Dispatcher.Invoke 在调度程序线程上执行操作,但这对我来说似乎毫无意义。 DispatcherTimer 使用起来比那个更简单并且它避免了另一个线程拥有自己的专用堆栈。

既然您已经表明您实际上没有 UI,DispatcherTimer 是错误的选择,因为没有涉及到调度程序。我会改为使用其他计时器类之一,例如System.Threading.Timer。在我看来,使用计时器比仅仅拥有一个单独的后台线程更清楚地表明意图(重复做某事)。不过,我不会担心这两种解决方案的效率

【讨论】:

  • 感谢您的回答。也许我应该补充一点,没有 UI - 因为我的应用程序只是一个在后台写入日志文件的跟踪器。然后,我认为 Thread.Sleep 也有效。但是,从答案来看,DispatcherTimer 是首选?
  • @casaout:如果您不需要在调度程序线程上被调用,我会使用不同的计时器,例如System.Threading.Timer。它仍然比使用 Thread.Sleep, IMO 更清楚地表明了您的意图。
  • 谢谢,那就是我要做的!
  • 我不敢相信我的建议与 Skeet 先生一致。哇。 在我的简历上 :-)
【解决方案2】:

DispatcherTimer 将每隔 N [时间单位] 在您的 UI 线程上调用一个方法。 Thread.Sleep 实际上会完全休眠线程。与前者不同的是,线程继续执行,然后调用Tick 事件,后者停止线程执行任何操作。

重要的是要意识到 UI 线程正忙于渲染 UI 并运行您的代码;因此,UI 线程中的休眠将被视为应用程序挂起。

【讨论】:

  • 谢谢。也许我应该补充一点,没有 UI - 因为我的应用程序只是一个在后台写入日志文件的跟踪器。然后,我认为 Thread.Sleep 也有效。但是,从答案来看,DispatcherTimer 是首选?
  • 如果没有 UI 并且您唯一关心的是您自己的代码,则使用 Timer 类。 DispatcherTimer 真正用于 UI 上的 Timer 操作。
  • 谢谢,那我就这么做!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2013-04-28
  • 2012-03-24
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多