多次调用使用 System.Timers.Timer 的方法

本文关键字:Timers Timer 方法 System 调用 | 更新日期: 2023-09-27 18:31:13

我不知道如何用一个好的标题创建这篇文章,所以我事先道歉。

我在以下方法中使用System.Timers.Timer暂停一段时间。本质上,我只实例化该类一次,然后使用不同的 Double 值多次调用以下方法 TestDelay()。

实例化 ToErase 一次,但调用TestDelay()两次,问题是没有延迟。另一方面,如果我实例化类 ToErase 两次,每个实例调用TestDelay()一次,则延迟就会发生。我认为这是由于私有财产延迟,它在同一实例中共享。

我的问题是,我需要如何修改这个类,以便我只能实例化一次 ToErase 并多次调用 TestDelay()?

我考虑过Thread.Sleep(),但它使整个控制台应用程序处于睡眠状态,包括当前可能正在运行的任何其他TestDelay()实例。

这是我的代码:

class ToErase
{
    private System.Timers.Timer Delay;
    private ManualResetEventSlim ev = new ManualResetEventSlim(false);
    public void TestDelay(Double ms)
    {
        Console.Write(".");
        ev = new ManualResetEventSlim(false);
        //TimeSpan span = DateTimeRun.AddMinutes(Offset).Subtract(now);
        Delay = new System.Timers.Timer(ms);
        Delay.Enabled = true;
        Delay = new System.Timers.Timer(ms);
        Delay.Elapsed += Delay_Elapsed;
        Delay.Enabled = true;
        while (Delay.Enabled)
        {
            string s = "";
            ////Wait until time passes
        }
        Console.WriteLine("Timer completed for QTR");
    }
    private void Delay_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Delay.Enabled = false;
        ev.Set();
    }
}

多次调用使用 System.Timers.Timer 的方法

这个类有很多问题。 我假设你是OO编程的新手。

Thread.Sleep是你想要的。 没有理由编写自己的函数。

你说 Thread.Sleep() "使整个控制台应用程序休眠"。 如果你让你的类工作,它也会延迟"整个控制台应用程序",但情况会更糟,因为它会一直旋转处理器。

问题中的措辞让我怀疑您正在使用多个线程。 如果您观察到 Thread.Sleep 暂停了主线程,但 TestDelay 没有,原因可能是您调用不同函数的方式。

最后,如果你是编程新手,我强烈建议你暂时避免使用多线程代码。