我不知道如何创建一个好标题的帖子,所以我事先道歉。
我在以下方法中使用System.Timers.Timer
来暂停一段时间。本质上我只对类进行一次实例化,然后使用不同的Double值多次调用以下方法TestDelay()。
实例化ToErase一次但是调用TestDelay()
两次的问题是没有进行延迟。另一方面,如果我实例化类ToErase两次并且每个实例调用TestDelay()
一次,那么就会产生延迟。我认为这是由于私有属性Delay,它在同一个实例中共享。
我的问题是,我怎么需要修改这个类,以便我只能实例化一次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();
}
}
答案 0 :(得分:0)
这门课有很多不妥之处。我假设你是OO编程的新手。
Thread.Sleep就是你想要的。没有理由编写自己的函数。
你说Thread.Sleep()"睡眠整个控制台应用程序。"如果你让你的班级工作,它也会延迟整个控制台应用程序"但情况会更糟,因为它会在整个时间内旋转处理器。
您问题中的措辞让我怀疑您正在使用多个线程。如果您发现Thread.Sleep暂停主线程,但TestDelay没有,原因可能是您调用不同函数的方式。
最后,如果您不熟悉编程,我强烈建议您暂时避免使用多线程代码。