【问题标题】:Why is Threading.Timer delegate stalling?为什么 Threading.Timer 委托停止?
【发布时间】:2016-07-22 10:52:44
【问题描述】:

我的 WPF 应用程序在其“引导”过程的早期启动了 Threading.Timer。定时器间隔为 100 毫秒,定时器委托中的代码通常需要大约 70 毫秒(它在一系列for 循环中执行许多操作,其中一些涉及从串行端口读取)。启动计时器后,初始化应用程序的其余部分(向 DI 框架注册的类型、视图的创建、视图模型、各种其他初始化功能)。在这几秒钟内,计时器委托中执行的代码完全“停止”。它永远不会失败,并且它的串行读取都不会失败(这是否纯粹是运气) - 计时器代码似乎只是暂停执行大约 3 秒。

我只能假设所有这些启动内容(在 UI 线程上)都获得了更高的优先级,从而阻止了计时器线程获得任何 CPU 时间。我能做些什么吗?稍后在引导过程中启动计时器可能是一种选择,但我想先探索其他解决方案。

在旁注中,Threading.Timer 如何处理“重新进入”(如果这是正确的术语),即在前一次调用仍在运行时计时器“滴答”?下一个调用是否会“排队”并在上一个调用最终完成时运行,还是我需要自己处理?

【问题讨论】:

    标签: c# multithreading timer


    【解决方案1】:

    1) 计时器在需要时立即启动其任务,无需排队。你可以自己检查一下,安排这样的事情:

    Console.WriteLine("Sleep");
    Thread.Sleep(10000);
    Console.WriteLine("Awaken");
    

    你会看到类似这样的输出,周期为 1 秒:

    Sleep
    Sleep
    Sleep
    Sleep
    Sleep
    Sleep
    Awaken
    Awaken
    Awaken
    Awaken
    ...
    

    2) 您可以更改线程优先级,但它可能对您没有任何好处。所有 .net 计时器都不适用于实时使用。所以不,你对此无能为力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多