【问题标题】:Timer in threading is not calling method again after time interval [duplicate]线程中的计时器在时间间隔后不再调用方法[重复]
【发布时间】:2018-02-09 15:46:00
【问题描述】:

我试图在下面给出的代码中找出问题所在。 timer 只为第一个实例调用该方法,但在 2500 ms 时间间隔后不调用它。有什么我遗漏的吗?下面是我的代码

public class Program
{
    public void CheckStatus(object stateInfo)
    {
        Console.WriteLine("I am Executed");
    }

    public static void Main(string[] args)
    {
        try
        {
            Program p = new Program();
            Console.WriteLine("Creating timer.\n");
            var stateTimer = new Timer(state => p.CheckStatus(state), null, 0, 2500);
        }

        catch (Exception ex)
        {
            Console.WriteLine("Exception");
        }
    }
}

在上面的代码中,我试图在每 2500 毫秒后执行方法“CheckStatus”,并且对于第一次执行,它应该立即执行(将参数传递为 0) 我也尝试用时间跨度替换时间值,但它也没有为我工作

【问题讨论】:

  • 计时器到期后不会重新启动。您需要告诉它重新启动。
  • 我不想让计时器过期,我应该一直运行到我的应用程序运行为止
  • 查看 MSDN,msdn.microsoft.com/en-us/library/… 听起来像 AutoReset 属性就是你要找的。​​span>
  • 如果这是 Main 的完整扩展,那么问题是你的程序在你有机会第二次执行计时器之前就退出了
  • 有两个基本原因。 1:停止 Main() 方法退出并因此终止程序没有任何意义。 2:局部变量不足以防止 Timer 对象被垃圾回收。

标签: c#


【解决方案1】:

您的程序在第二个间隔触发之前存在。以某种方式等待下一个时间间隔的回调。控制台示例最常用的方法是 ReadLine(更多选项 - How to stop C# console applications from closing automatically?):

Console.WriteLine("Creating timer.\n");
var stateTimer = new Timer(state => p.CheckStatus(state), null, 0, 2500);
Console.ReadLine();

如果使用Timer,即使Thread.Sleep(10000); 也会这样做,因为计时器回调在单独的线程上运行。

注意:定时器停止触发的另一个标准原因是定时器被垃圾收集,但在您的示例中并非如此。请参阅System.Threading.Timer not firing after some time 了解更多信息。

【讨论】:

  • 我不能使用console.readline,因为我还必须执行其他任务,并且预计不会有控制台输入。所以我创建了一个任务并调用线程睡眠 2500 毫秒并在 while 循环中执行。这个解决方案对我有用,但重点是它是否是实现这一目标的好方法?
  • @Pavan 给定方法是否适用于您的代码是您的决定。如果您有理由相信您的解决方案有问题 - 请随时提出新问题(显然,请务必先搜索类似的帖子/文章)。请注意,在 SO 上不欢迎一般的“它对我的案例来说是不是好的设计”问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多