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

时间:2014-11-20 22:14:32

标签: c# visual-studio-2010

我不知道如何创建一个好标题的帖子,所以我事先道歉。

我在以下方法中使用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();
    }

}

1 个答案:

答案 0 :(得分:0)

这门课有很多不妥之处。我假设你是OO编程的新手。

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

你说Thread.Sleep()"睡眠整个控制台应用程序。"如果你让你的班级工作,它也会延迟整个控制台应用程序"但情况会更糟,因为它会在整个时间内旋转处理器。

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

最后,如果您不熟悉编程,我强烈建议您暂时避免使用多线程代码。

相关问题