多次调用使用 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();
}
}
这个类有很多问题。 我假设你是OO编程的新手。
Thread.Sleep是你想要的。 没有理由编写自己的函数。
你说 Thread.Sleep() "使整个控制台应用程序休眠"。 如果你让你的类工作,它也会延迟"整个控制台应用程序",但情况会更糟,因为它会一直旋转处理器。
您问题中的措辞让我怀疑您正在使用多个线程。 如果您观察到 Thread.Sleep 暂停了主线程,但 TestDelay 没有,原因可能是您调用不同函数的方式。
最后,如果你是编程新手,我强烈建议你暂时避免使用多线程代码。