3

我有 5 种方法,我需要在随机间隔(1 到 3 秒)的时间后调用它们。说第一个方法在 1 秒后调用,然后在 2.3 秒后调用第二个方法,在 1.5 后调用下一个方法等。我使用计时器进行了以下操作

    Random rand = new Random();
    fortimerinterval1 = rand.Next(1000, 3000);
    mytimer1.Interval = fortimerinterval1; 
    mytimer1.Enabled = true;
    mytimer1.Start();

但问题是,定时器间隔不会每次都改变。第一次后定时器间隔保持不变。如何使其随机化,以便每次计时器间隔发生变化。

4

3 回答 3

8

做这样的事情

Random rand = new Random();
Timer mytimer = new Timer();

private void button1_Click(object sender, EventArgs e)
{
    mytimer.Tick += new EventHandler(TimerEventProcessor);
    int fortimerinterval = rand.Next(1000, 3000);
    mytimer.Interval = fortimerinterval;
    mytimer.Enabled = true;
    mytimer.Start();
}

public void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
{
    int fortimerinterval = rand.Next(1000, 3000);
    mytimer.Interval = fortimerinterval;

    System.Diagnostics.Debug.WriteLine(DateTime.Now);
}
于 2013-04-01T06:40:43.543 回答
4

在计时器经过的方法中设置时间间隔。

    Random rand = new Random();

    private void OnTick(object sender, EventArgs eventArgs)
    {

        _timer.Interval = rand.Next(1000, 3000);
    }
于 2013-03-31T22:49:37.480 回答
1

如果您使用 System.Timers.Timer,请注意重叠的回调。例如,如果第一个刻度在 1 秒后触发,并且您在刻度回调中调用的方法需要超过 1 秒才能完成,那么您将在第一个刻度后 1 秒调用另一个刻度回调,然后再更改间隔。

我将使用配置为触发一次的 System.Threading.Timer 并在回调方法中将其更改为在下一个随机间隔再次触发。

像这样:

    public TestClass()
    {
        _random = new Random(Environment.TickCount);
        _timer = new Timer(TimerCallback, null, _random.Next(1000, 3000), Timeout.Infinite);
    }

    private void TimerCallback(object state)
    {
        try
        {
            // Do something.
        }
        finally
        {
            _timer.Change(_random.Next(1000, 3000), Timeout.Infinite);
        }
    }
于 2013-03-31T23:20:25.927 回答